Обнаружение краев на изображении после применения фильтра sobel и лапласиана в opencv - PullRequest
1 голос
/ 12 марта 2020

Я делаю сегментацию изображения на изображении, и это хорошо, но я пытаюсь применить сегментацию изображения, используя обнаружение резких краев на изображении после наложения фильтра Лапласа и Собеля. Да, я сделал нормализацию значений и преобразовал изображение в оттенки серого. Я не могу определить края в конечном изображении или рыданиях. следующая ошибка

ошибка: OpenCV (4.2.0) C: \ projects \ opencv-python \ opencv \ modules \ imgproc \ src \ canny. cpp: 829: ошибка: (-215: подтверждение не выполнено) _sr c .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')

enter image description here

Ответы [ 2 ]

2 голосов
/ 12 марта 2020

Изображение, переданное в 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)
0 голосов
/ 12 марта 2020

Код ошибки говорит, что вы должны сначала преобразовать ваше изображение в CV_8U формат глубины. И sob в формате глубины CV_64F. Так что это должно работать:

sob = np.uint8(sob*255)
canny1=cv.Canny(sob,100,200)    #after that you can call Canny
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...