【问题标题】:edge detection opencv python边缘检测opencv python
【发布时间】:2021-05-23 15:22:09
【问题描述】:

这是我的代码,我正在尝试使用 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()

【问题讨论】:

  • 你是否可以使用imshow 编写一个显示任何图像的程序(无需尝试在顶部进行边缘检测)?
  • 我不明白
  • 你能写一个加载图像并显示它的工作程序吗?
  • 是的,我可以使用 cv2
  • img=cv2.imread("lena.jpg") cv2.imshow("img",img)

标签: python opencv


【解决方案1】:

您的代码中有错误。
尝试使用 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()

注意:

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

【讨论】:

  • 其实,我知道这个方法,但我想像我的代码一样写,但我不知道它是怎么回事
  • for 循环没有像它应该做的那样做卷积或 2d 过滤。
  • 尝试阅读卷积的定义
  • 但是为什么程序不再响应了?
  • 您的代码正在运行。但我的代码不能这样说
猜你喜欢
  • 1970-01-01
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多