为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁花如伊 2021-11-23 19:03:53
我目前正在开展一个项目,通过图像处理测量开放渠道中的水位。我的主要问题是,由于我们的实验室条件,我必须处理相当有问题的图像。(即糟糕的照明,糟糕的背景等)目前这是我拥有的最好的图像,将来我会得到更好的图像,但现在这就是我正在使用的图像。由于图片中有太多内容,我决定过滤蓝色以绘制一些轮廓并选择我需要处理的轮廓。但我似乎无法很好地解决它以检测每个蓝色矩形。我还尝试对图像进行灰度处理,然后绘制轮廓,这似乎效果更好,但仍然不够。对于测量,我计划使用霍夫变换。我的问题是;我是否完全错误地处理了这个问题,或者我目前正在使用的图像根本不够好,无法处理?我应该尝试不同的库或语言吗?
查看完整描述

1 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

不要让它太复杂。我使用了你的一些代码。


PS:我只能帮助您达到可以专注于尝试测量水位的程度。但我会在最后给你一个提示


import numpy as np

import cv2


def show(img):

    cv2.imshow('a',img)

    cv2.waitKey()

    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]=0



kernel = 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-opencv

stencil = np.zeros(img.shape).astype(img.dtype)

color = [255, 255, 255]

cv2.fillPoly(stencil, contours, color)

img = cv2.bitwise_and(img, stencil)

# END of snippet

img[np.where(np.all(img==[255,255,255],axis = 2))]=[0,0,0]



show(img)

结果

//img1.sycdn.imooc.com//619ccacf0001004a12400590.jpg

我做了什么?:我会用图片来解释你。

灰度阈值

//img1.sycdn.imooc.com//619ccada00013b2312280679.jpg

阈值模糊以填充线条

//img1.sycdn.imooc.com//619ccae80001cbf212430682.jpg

所有不是纯白色的东西 [255,255,255] 都变成了 [0,0,0]

用形态学技巧摆脱单独的小颗粒

//img1.sycdn.imooc.com//619ccb070001cafe12430686.jpg

绘制特定尺寸的轮廓 - 去除太大和太小的轮廓

//img1.sycdn.imooc.com//619ccb1600018e8f12450623.jpg

最后用 cv2.polly 去掉countours 之外的所有东西并将其变成黑色。最先看到的图像的结果

至于水位测量我真的不知道,我不想深入研究,但也许你可以玩 sobely

sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)

//img1.sycdn.imooc.com//619ccb220001191c12420534.jpg

查看完整回答
反对 回复 2021-11-23
  • 1 回答
  • 0 关注
  • 199 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信