下面的图像显示了一个房屋块的航拍照片(以最长的垂直边重新定向),以及经过自适应阈值和高斯差的同一图像。
图像:基础;自适应阈值;高斯的差异
在AdThresh的图像上,房子的屋顶印记是显而易见的(对人眼来说):这是一个连接一些明显点的问题。在示例图像中,找到下方的蓝色边界框
用蓝色标记所需矩形的图像
我曾尝试过实现HoughLinesP()
和findContours()
,但没有得到任何合理的结果(可能是因为我缺少了一些细微之处)。python脚本块在远程找不到任何类似蓝框的东西,如下所示:
import cv2
import numpy as np
from matplotlib import pyplot as plt
# read in full (RGBA) image - to get alpha layer to use as mask
img = cv2.imread('rotated_12.png', cv2.IMREAD_UNCHANGED)
grey = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# Otsu's thresholding after Gaussian filtering
blur_base = cv2.GaussianBlur(grey,(9,9),0)
blur_diff = cv2.GaussianBlur(grey,(15,15),0)
_,thresh1 = cv2.threshold(grey,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
thresh = cv2.adaptiveThreshold(grey,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,11,2)
DoG_01 = blur_base - blur_diff
edges_blur = cv2.Canny(blur_base,70,210)
# Find Contours
(ed, cnts,h) = cv2.findContours(grey, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = sorted(cnts, key = cv2.contourArea, reverse = True)[:4]
for c in cnts:
approx = cv2.approxPolyDP(c, 0.1*cv2.arcLength(c, True), True)
cv2.drawContours(grey, [approx], -1, (0, 255, 0), 1)
# Hough Lines
minLineLength = 30
maxLineGap = 5
lines = cv2.HoughLinesP(edges_blur,1,np.pi/180,20,minLineLength,maxLineGap)
print "lines found:", len(lines)
for line in lines:
cv2.line(grey,(line[0][0], line[0][1]),(line[0][2],line[0][3]),(255,0,0),2)
# plot all the images
images = [img, thresh, DoG_01]
titles = ['Base','AdThresh','DoG01']
for i in xrange(len(images)):
plt.subplot(1,len(images),i+1),plt.imshow(images[i],'gray')
plt.title(titles[i]), plt.xticks([]), plt.yticks([])
plt.savefig('a_edgedetect_12.png')
cv2.destroyAllWindows()
我试着在没有过度参数化的情况下进行设置。我对仅为这一张图像"定制"算法持谨慎态度,因为这一过程将在数十万张图像上运行(屋顶/凹槽的颜色不同,与背景的区别可能较小)。也就是说,我希望看到一个"击中"蓝框目标的解决方案——这样我至少可以找出我做错了什么。
如果有人有一种快速而肮脏的方法来做这类事情,那么获得一个Python代码片段来处理将是非常棒的。
"基础"图像->
基本图像
您应该应用以下内容:
1.对比度受限自适应直方图均衡CLAHE并转换为灰度
2.高斯模糊&@bad_keypoints提到的形态转换(拨号、侵蚀等)。这将帮助您消除背景噪声。这是最棘手的一步,因为结果将取决于应用的顺序(首先是高斯模糊,然后是形态变换,反之亦然)以及为此选择的窗口大小
3.应用自适应阈值
4.应用Canny的边缘检测
5.找到具有四个角点的轮廓
如前所述,您需要调整这些函数的输入参数,还需要使用其他图像验证这些参数。因为它可能适用于这种情况,但不适用于其他情况。根据反复试验,您需要修复参数值。