OpenCV 使用各种方法在较差的图像上绘制轮廓

我目前正在开展一个项目,通过图像处理测量开放渠道中的水位。我的主要问题是,由于我们的实验室条件,我必须处理相当有问题的图像。(即糟糕的照明,糟糕的背景等)

http://img3.mukewang.com/619ccab6000190de12440696.jpg

目前这是我拥有的最好的图像,将来我会得到更好的图像,但现在这就是我正在使用的图像。

由于图片中有太多内容,我决定过滤蓝色以绘制一些轮廓并选择我需要处理的轮廓。但我似乎无法很好地解决它以检测每个蓝色矩形。我还尝试对图像进行灰度处理,然后绘制轮廓,这似乎效果更好,但仍然不够。对于测量,我计划使用霍夫变换。

我的问题是;我是否完全错误地处理了这个问题,或者我目前正在使用的图像根本不够好,无法处理?我应该尝试不同的库或语言吗?


繁花如伊
浏览 242回答 1
1回答

largeQ

不要让它太复杂。我使用了你的一些代码。PS:我只能帮助您达到可以专注于尝试测量水位的程度。但我会在最后给你一个提示import numpy as npimport cv2def show(img):&nbsp; &nbsp; cv2.imshow('a',img)&nbsp; &nbsp; cv2.waitKey()&nbsp; &nbsp; cv2.destroyAllWindows()mask = cv2.imread("azC2r.jpg",0)img = cv2.imread("azC2r.jpg")print('Image shape: {}'.format(img.shape))ret,thresh = cv2.threshold(mask,50,255,cv2.THRESH_BINARY)thresh = cv2.blur(thresh,(7,7))thresh[thresh<254]=0kernel = np.ones((7,7))thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)kernel = np.ones((9,9))thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)im2, contours,_ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)contours = [cnt for cnt in contours if cv2.contourArea(cnt)<100000]cv2.drawContours(img, contours, -1, (0,255,0), 3)# Thank to this snippet to# https://stackoverflow.com/questions/37912928/fill-the-outside-of-contours-opencvstencil = np.zeros(img.shape).astype(img.dtype)color = [255, 255, 255]cv2.fillPoly(stencil, contours, color)img = cv2.bitwise_and(img, stencil)# END of snippetimg[np.where(np.all(img==[255,255,255],axis = 2))]=[0,0,0]show(img)结果我做了什么?:我会用图片来解释你。灰度阈值阈值模糊以填充线条所有不是纯白色的东西 [255,255,255] 都变成了 [0,0,0]用形态学技巧摆脱单独的小颗粒绘制特定尺寸的轮廓 - 去除太大和太小的轮廓最后用 cv2.polly 去掉countours 之外的所有东西并将其变成黑色。最先看到的图像的结果至于水位测量我真的不知道,我不想深入研究,但也许你可以玩&nbsp;sobelysobely&nbsp;=&nbsp;cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python