首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于opencv的Sobel边缘检测

基于opencv的Sobel边缘检测
EN

Stack Overflow用户
提问于 2018-07-04 15:10:21
回答 3查看 8.6K关注 0票数 2

我正在使用openCV中内置的Sobel边缘操作进行一些图像处理,但结果与函数的预期不同。

代码语言:javascript
复制
sobel=cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
cv2.imshow('Sobel Image',sobel)

我附上了输入图像的样本图像和我得到的结果输出。关于这一点,请帮助我。左边是输入图像,右边是结果图像。

EN

回答 3

Stack Overflow用户

发布于 2020-03-15 21:21:09

您必须执行两个sobel操作,然后将它们混合。此外,请确保您正在处理灰度图像,否则我认为它将分别处理每个通道。

代码语言:javascript
复制
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

grad_x = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3)
grad_y = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3)

abs_grad_x = cv2.convertScaleAbs(grad_x)
abs_grad_y = cv2.convertScaleAbs(grad_y)

grad = cv2.addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0)

cv2.imshow('grad X',grad_x)
cv2.imshow('grad Y',grad_y)
cv2.imshow('Sobel Image',grad)
cv2.waitKey()

xy和混合图像的结果是:

如果你需要减少噪声,你可以应用高斯模糊。请参阅:https://docs.opencv.org/4.2.0/d2/d2c/tutorial_sobel_derivatives.html

票数 5
EN

Stack Overflow用户

发布于 2020-05-13 10:00:20

Sobel运算符给出x或y方向的梯度。对于基于Sobel的边缘检测,您可以将梯度的大小与阈值进行比较,以确定哪些像素是边缘。下面的代码显示了如何计算梯度(幅度)并将其归一化显示。

代码语言:javascript
复制
import cv2
import numpy as np

def sobel_edge_detector(img):
    grad_x = cv2.Sobel(img, cv2.CV_64F, 1, 0)
    grad_y = cv2.Sobel(img, cv2.CV_64F, 0, 1)
    grad = np.sqrt(grad_x**2 + grad_y**2)
    grad_norm = (grad * 255 / grad.max()).astype(np.uint8)
    cv2.imshow('Edges', grad_norm)
    cv2.waitKey(0)

注意:OpenCV的tutorial page on Sobel Derivatives使用了以下计算,但它们都是不正确的。

代码语言:javascript
复制
// converting back to CV_8U
convertScaleAbs(grad_x, abs_grad_x);
convertScaleAbs(grad_y, abs_grad_y);
...
addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad);
票数 4
EN

Stack Overflow用户

发布于 2018-07-04 15:19:44

对于这幅图像,你需要在使用Sobel算子之前对图像进行阈值处理,以降低噪声。

代码语言:javascript
复制
image = cv2.imread('image.jpg',cv2.IMREAD_UNCHANGED)

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

ret,binary = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY_INV)

H = cv2.Sobel(binary, cv2.CV_8U, dx=0, dy=1, ksize=3)
V = cv2.Sobel(binary, cv2.CV_8U, dx=1, dy=0, ksize=3)

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51167768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档