Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python OpenCV在差图像上用各种方法绘制等高线_Python_Opencv_Image Processing - Fatal编程技术网

Python OpenCV在差图像上用各种方法绘制等高线

Python OpenCV在差图像上用各种方法绘制等高线,python,opencv,image-processing,Python,Opencv,Image Processing,我目前正在做一个项目,用图像处理技术测量明渠的水位。我的主要问题是,由于我们的实验室条件,我必须处理一些有问题的图像。(即照明不良、背景不良等) 目前这是我拥有的最好的图像,我将来会得到更好的图像,但现在这是我正在处理的 由于图片中有太多的内容,我决定过滤蓝色以绘制一些轮廓,并选择需要处理的轮廓。但我似乎无法很好地绕过它来检测每个蓝色矩形。我也尝试过对图像进行灰度化,然后绘制轮廓,这似乎效果更好,但仍然不够。对于测量,我计划使用Hough变换 我的问题是,;我是完全错误地处理这个问题,还是我目前

我目前正在做一个项目,用图像处理技术测量明渠的水位。我的主要问题是,由于我们的实验室条件,我必须处理一些有问题的图像。(即照明不良、背景不良等)

目前这是我拥有的最好的图像,我将来会得到更好的图像,但现在这是我正在处理的

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

我的问题是,;我是完全错误地处理这个问题,还是我目前正在处理的图像根本不够好?我应该尝试不同的库或语言吗?这是我目前的代码

from imutils import perspective
from imutils import contours
import numpy as np
import imutils
import cv2 as cv


blueLow = np.array([90, 50, 20])
blueHigh = np.array([130, 255, 255])

img = cv.imread("10ltsn.png")
imgHSV = cv.cvtColor(img, cv.COLOR_BGR2HSV)
mask = cv.inRange(imgHSV, blueLow, blueHigh)
##imgray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

##kernelOpen = np.ones((5,5))
##kernelClose = np.ones((20,20))
##maskOpen = cv.morphologyEx(mask, cv.MORPH_OPEN, kernelOpen)
##maskClose = cv.morphologyEx(maskOpen, cv.MORPH_CLOSE, kernelClose)

##imgray = cv.GaussianBlur(imgray, (5,5), 0)
##imgray = cv.bilateralFilter(imgray,9,75,75)

edge = cv.Canny(mask, 50, 200)
edge = cv.dilate(edge, None, iterations=1)
edge = cv.erode(edge, None, iterations=1)


cnt = cv.findContours(edge.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
cnt = imutils.grab_contours(cnt)

##(cnt, _) = contours.sort_contours(cnt)

for k in cnt:
    if cv.contourArea(k) < 1000:
        continue

    main = img.copy()
    box = cv.minAreaRect(k)
    box = cv.boxPoints(box)
    box = np.array(box, dtype="int")

    box = perspective.order_points(box)
    cv.drawContours(main, [box.astype("int")], -1, (0, 255, 0), 1)

    for (x, y) in box:
        cv.circle(main, (int(x), int(y)), 5, (0, 0, 255), -1)

    cv.imshow("main", main)
    cv.waitKey(0)



##cv.imshow("img", img)
##cv.imshow("mask", mask)
##cv.imshow("mask2", mask2)
##cv.imshow("edge", edged)
##cv.imshow("maskClose", maskClose)
##cv.imshow("maskOpen", maskOpen)

##cv.waitKey(0)
cv.destroyAllWindows()
从imutils导入角度
从imutils导入等高线
将numpy作为np导入
导入imutils
将cv2作为cv导入
blueLow=np.数组([90,50,20])
blueHigh=np.array([130,255,255])
img=cv.imread(“10ltsn.png”)
imgHSV=cv.CVT颜色(img,cv.COLOR\u BGR2HSV)
遮罩=范围内的cv(imgHSV、蓝低、蓝高)
##imgray=cv.CVT颜色(img,cv.COLOR\U BGR2GRAY)
##kernelOpen=np.one((5,5))
##kernelClose=np.one((20,20))
##maskOpen=cv.morphologyEx(遮罩,cv.Morpho_开放,kernelOpen)
##maskClose=cv.morphologyEx(maskOpen、cv.Morpho_CLOSE、kernelClose)
##imgray=cv.GaussianBlur(imgray,(5,5,0)
##imgray=cv.双边过滤器(imgray,9,75,75)
边缘=cv.Canny(遮罩,50,200)
边=cv.扩张(边,无,迭代次数=1)
边=cv.侵蚀(边,无,迭代次数=1)
cnt=cv.findContours(edge.copy()、cv.RETR\u EXTERNAL、cv.CHAIN\u APPROX\u SIMPLE)
cnt=imutils.GRAP_轮廓(cnt)
##(cnt,u)=等高线。等高线排序(cnt)
对于碳纳米管中的k:
如果等高线面积(k)<1000:
持续
main=img.copy()
方框=等速最小值(k)
长方体=cv.长方体点(长方体)
box=np.array(box,dtype=“int”)
框=透视图。顺序点(框)
等高线图(主[box.astype(“int”)],-1,(0,255,0),1)
对于框中的(x,y):
等速圆(主(整数(x),整数(y)),5,(0,0,255),-1)
cv.imshow(“主要”,主要)
cv.waitKey(0)
##简历imshow(“img”,img)
##简历:imshow(“面具”,面具)
##简历imshow(“mask2”,mask2)
##cv.imshow(“边缘”,边缘)
##简历:imshow(“maskClose”,maskClose)
##简历:imshow(“maskOpen”,maskOpen)
##cv.waitKey(0)
cv.destroyAllWindows()

不要把它弄得太复杂。我使用了您的一些代码。

附言:我只能在一定程度上帮助你集中精力测量水位。但最后我会给你一个提示


不要把它弄得太复杂。我使用了您的一些代码。

附言:我只能在一定程度上帮助你集中精力测量水位。但最后我会给你一个提示


您能显示预期结果吗?我希望能够找到屏幕截图中显示的每个矩形,以便我可以分别在它们中工作以测量水深。你能显示预期的结果吗?我想能够找到屏幕截图中显示的每个矩形,这样我就可以分别在它们中工作来测量水深。哦,哇,这其实是更好更简单,谢谢你。当我得到一些没有反射的图像时,我会马上去看sobely。哦,哇,这实际上是更好更简单了,谢谢。当我得到一些没有反射的图像时,我会尽快地去看sobely。
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)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)