我正在对图像进行图像分割,但是我想做的是在应用Laplacian和Sobel滤镜的并集之后,使用Canny边缘检测对图像进行图像分割。是的,我已经完成了值的归一化并将图像转换为灰度。我无法在最终图像或sob中进行边缘检测。 以下错误
错误:OpenCV(4.2.0) C:\ projects \ opencv-python \ opencv \ modules \ imgproc \ src \ canny.cpp:829: 错误:(-215:声明失败)_src.depth()==函数中的CV_8U 'cv :: Canny'
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
path=r"C:\Users\MACHINE\Desktop\3.jpg"
img=cv.imread(path)
img=cv.cvtColor(img,cv.COLOR_RGB2GRAY)
laplacian=cv.Laplacian(img,cv.CV_64F)
laplacian=(laplacian-laplacian.min())/(laplacian.max()-laplacian.min())
sobelx = cv.Sobel(img,cv.CV_64F,1,0,ksize=5)
sobely = cv.Sobel(img,cv.CV_64F,0,1,ksize=5)
sob=(sobelx+sobely)
sob=(sob-sob.min())/(sob.max()-sob.min()) # taking care of negative values and values out of range
final=sob+laplacian
final=(final-final.min())/(final.max()-final.min())
print(sob.shape)
#canny1=cv.Canny(sob,100,200) #thise code is showing error on sob .but works perfectly fine on orginal image
plt.subplot(2,2,1)
plt.imshow(canny1,cmap='gray')
plt.subplot(2,2,2)
plt.imshow(sob,cmap='gray')
plt.subplot(2,2,3)
plt.imshow(final,cmap='gray')
答案 0 :(得分:2)
传递给Canny
的图像必须为uint8
,但是您的sob
,laplacian
和final
为float64
,范围为0 -1。
您可以乘以255,然后转换为uint8:
canny1 = cv.Canny(np.uint8(sob * 255) ,100, 200)
或:
canny1 = cv.Canny(cv.convertScaleAbs(sob * 255) ,100, 200)
答案 1 :(得分:0)
错误代码表明您应该首先将图像转换为CV_8U
深度格式。 sob
的格式为CV_64F
。所以这应该工作:
sob = np.uint8(sob*255)
canny1=cv.Canny(sob,100,200) #after that you can call Canny