我正在尝试进行边缘检测,将流动图中的左图生成右图。
图中有3个不同颜色的区域,因此结果应有3个分离的部分。
这是我的代码
img = cv2.imread('img2.png')imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)f, axs = plt.subplots(1,2,figsize=(12,8))edges = cv2.Canny(img,1,255)axs[0].imshow(imgRGB)axs[1].imshow(edges,cmap = 'gray')
这是输出结果
原始图像中红色部分的边缘被OpenCV忽略了,这不符合我的需求。
方形边缘也被丢弃了,这不符合我的需求。
右侧Axes中检测到的边缘不连续,这不符合我的需求。
有没有办法修复以上三个问题?或者如何实现一个新的算法来满足我的需求?
回答:
你可以通过更改Canny的数值来改善结果。因为你的图像由颜色相似的区域组成,你可以很好地找到边缘:
你可以使用以下代码自己尝试:
import cv2import numpy as npcv2.namedWindow('Result')img = cv2.imread('qkEuE.png')v1 = 0v2 = 0def doEdges(): edges = cv2.Canny(img,v1,v2) edges = cv2.cvtColor(edges,cv2.COLOR_GRAY2BGR) res = np.concatenate((img,edges),axis = 0) cv2.imshow('Result',res)def setVal1(val): global v1 v1 = val doEdges()def setVal2(val): global v2 v2 = val doEdges()cv2.createTrackbar('Val1','Result',0,500,setVal1)cv2.createTrackbar('Val2','Result',0,500,setVal2)cv2.imshow('Result',img)cv2.waitKey(0)cv2.destroyAllWindows()