边缘检测opencv-python



这是我的代码,我正在尝试使用sobel方法进行边缘检测。但我既没有得到错误,也没有得到图像。如果我有错,你能解释一下在哪里吗?

import cv2
import numpy as np
img=cv2.imread("lena.jpg")
img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
m,n=img.shape

kernelx=np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]])
kernely=np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]])

gx=np.zeros((m,n), dtype=np.int32)
gy=np.zeros((m,n), dtype=np.int32)

for x in range(1,m-1):
for y in range(1,n-1):
for a in range(3):
for b in range(3):
xn = x + a - 1
yn = y + b - 1
gx=gx+(kernelx[a][b]*img[xn][yn])
gy=gy+(kernely[a][b]*img[xn][yn])



final_image=np.sqrt(pow(gx,2.0)+pow(gy,2.0))

cv2.imshow("a",final_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

您的代码中有一个错误
尝试使用cv2.filter2D((而不是for循环。

import cv2
import numpy as np
img = cv2.imread(r"lena.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
m, n = img.shape
kernelx = np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]])
kernely = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]])
img_x = cv2.filter2D(img, ddepth=cv2.CV_8U, kernel=kernelx)
img_y = cv2.filter2D(img, ddepth=cv2.CV_8U, kernel=kernely)
final_image = np.sqrt(pow(img_x, 2.0) + pow(img_y, 2.0))
cv2.imshow("a", final_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

如果你想用for循环来完成,正确的方法是:
我为你添加一个tqdm进度条;(

import cv2
import numpy as np
from tqdm import tqdm
img = cv2.imread(r"lena.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
m, n = img.shape
kernelx = np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]])
kernely = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]])
out_im = np.zeros((m-2, n-2))
g_x = np.zeros((m-2, n-2))
g_y = np.zeros((m-2, n-2))
for m_i in tqdm(range(m-2)):
for n_i in range(n-2):
im_patch = img[m_i:m_i+3, n_i:n_i+3]
g_x[m_i, n_i] = sum([i * k for i, k in zip(im_patch.flatten(), kernelx.flatten())])
g_y[m_i, n_i] = sum([i * k for i, k in zip(im_patch.flatten(), kernely.flatten())])
out_im = np.sqrt(g_x ** 2 + g_y ** 2)
out_im = np.uint8(out_im/out_im.max() * 255)
cv2.imshow("", out_im)
cv2.waitKey(0)
cv2.destroyAllWindows()

注:

您可能需要在显示之前对图像进行规范化。

最新更新