形態學邊緣提取
實現代碼:
def contour_morphology(image):
return image - cv2.erode(image, np.ones((3, 3), np.uint8))
實現很簡單,原圖減腐蝕的圖
結果
爲了去除房頂瓦片,對其進行均值平滑處理後的結果
mask_averaging = np.array([
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
], np.float)/25
house_averaging = cv2.filter2D(house, -1, mask_averaging)
house_contour_morphology = contour_morphology(house_averaging )
結果
雖然瓦片被去除了,可是輪廓邊粗了,房頂邊緣變弱
線的檢測
mask_45 = np.array([
[-1, -1, 2],
[-1, 2, -1],
[2, -1, -1],
])
house_segment_45 = cv2.filter2D(house_contour_morphology, -1, mask_45)
mask__45 = np.array([
[2, -1, -1],
[-1, 2, -1],
[-1, -1, 2],
])
house_segment__45 = cv2.filter2D(house_contour_morphology, -1, mask__45)
mask_0 = np.array([
[-1, -1, -1],
[2, 2, 2],
[-1, -1, -1],
])
house_segment_0 = cv2.filter2D(house_contour_morphology, -1, mask_0)
用上一步的輸出house_contour_morphology作爲輸入:
結果
方向固定,不能很好的檢測直線
梯度算子
mask_sobel_horizontal = np.array([
[-1, -2, -1],
[0, 0, 0],
[1, 2, 1],
])
mask_sobel_vertical = np.array([
[-1, 0, 1],
[-2, 0, 2],
[-1, 0, 1],
])
mask_sobel_diagonal = np.array([
[-2, -1, 0],
[-1, 0, 1],
[0, 1, 2],
])
house_sobel_horizontal = cv2.filter2D(house_contour_morphology, -1, mask_sobel_horizontal)
house_sobel_vertical = cv2.filter2D(house_contour_morphology, -1, mask_sobel_vertical)
house_sobel_diagonal = cv2.filter2D(house_contour_morphology, -1, mask_sobel_diagonal)
plt_show_opcv("house_sobel", house_sobel)
用上一步的輸出house_contour_morphology作爲輸入:
### 結果
霍夫/Hough變換
edges = cv2.Canny(house_contour_morphology, 50, 20)
re = np.zeros(house.shape, np.uint8)
lines = cv2.HoughLinesP(edges, 1, np.pi/180, 30, minLineLength=30, maxLineGap=5)
lines = lines[:, 0, :]
for x1, y1, x2, y2 in lines:
cv2.line(re, (x1, y1), (x2, y2), (255, 255, 255), 1)
先用Canny算法進行邊緣檢測,再用霍夫變換檢測直線輪廓。用上一步的輸出house_contour_morphology作爲輸入:
結果
原圖作爲輸入: