我用canny來檢測邊緣。但是,由于影像質量很差,很多噪聲如下:

原圖是這個。

我只想要矩形邊緣。因為我想要檢測的邊緣是如此規則(如磚塊)。我想知道是否有一些影像處理演算法可以幫助我?
請注意,影像中的某些邊緣是如此周,使用 GaussianBlur 可能會使這些邊緣難以被檢測到。
謝謝大家的回復。
uj5u.com熱心網友回復:
只是一個提示:在水平和垂直方向強烈模糊影像以獲得“干凈”的行可能很有用。由此您可以重建網格并可能檢查每個單元格。


uj5u.com熱心網友回復:
經過一些處理和過濾后,霍夫線變換可能是一個不錯的選擇,但您需要調整引數以滿足您的需求并檢測盡可能多的線。您可以在下面的代碼中看到的引數是:
- 高斯濾波器內核。
- Canny 邊緣檢測引數。
- 霍夫線檢測引數。
import cv2
import numpy as np
import matplotlib.pyplot as plt
import math
original = cv2.imread('input.png')
img = original.copy()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Histogram Equalization to eenhance contrast
equ = cv2.equalizeHist(gray)
# Noise Removal
blur = cv2.GaussianBlur(equ, (9,9), 0)
# Edge Detection
edges = cv2.Canny(blur,50,200)
# Lines Detection
lines = cv2.HoughLines (edges, 1, np.pi / 180, 150, None, 10, 0)
if lines is not None:
for i in range(0, len(lines)):
rho = lines[i][0][0]
theta = lines[i][0][1]
a = math.cos(theta)
b = math.sin(theta)
x0 = a * rho
y0 = b * rho
pt1 = (int(x0 1000*(-b)), int(y0 1000*(a)))
pt2 = (int(x0 - 1000*(-b)), int(y0 - 1000*(a)))
cv2.line(img, pt1, pt2, (0,0,255), 1, cv2.LINE_AA)
plt.subplot(121)
plt.imshow(original, cmap='gray')
plt.title("Original")
plt.subplot(122)
plt.imshow(img, cmap='gray')
plt.title("Processed")
plt.show()

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/410132.html
標籤:
上一篇:獲取有界多邊形的分割掩碼
