double magX = 0.0; // this is your magnitude
for(int a = 0; a < 3; a++)
{
for(int b = 0; b < 3; b++)
{
int xn = x + a - 1;
int yn = y + b - 1;
int index = xn + yn * width;
magX += image[index] * kernelx[a][b];
}
}
请注意,输入是灰度图像,它可以表示为1D的double数组(这只是一个技巧,因为可以使用index = [x y * width]访问坐标(x,y)中的像素值)
import cv2
import numpy as np
img = cv2.imread(INPUT_IMAGE)
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY).astype(float)
edge_x = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
edge_y = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
edge = np.sqrt(edge_x**2 + edge_y**2) # image can be normalized to
# fit into 0..255 color space
cv2.imwrite(OUTPUT_IMAGE, edge)
输入输出:
27
R markdown 文件中的所有上述步骤 . 希望这使它更直观,更容易理解 . 我需要实现一个sobel过滤器,这个页面帮助我理解了我在完成它时遇到一些麻烦的概念 . 所以把它放在一个地方希望它有所帮助 .
6 回答
这很简单,您只需要使用Sobel滤镜对图像进行卷积 . Sobel滤波器有两个内核,x方向内核和y方向内核 . x方向内核检测水平边缘,y方向内核检测垂直边缘 .
x方向内核(大小为3x3)
y方向内核
要计算像素(x,y)处的卷积,请定义大小等于内核大小的窗口(用于计算x中的幅度和y中的幅度的源代码是相同的):
请注意,输入是灰度图像,它可以表示为1D的double数组(这只是一个技巧,因为可以使用index = [x y * width]访问坐标(x,y)中的像素值)
在给定magX和magY的情况下计算像素(x,y)的大小:
mag = sqrt( magX^2 + magY^2 )
我见过这个日期的最简单的解释来自Saush's blog,一位曾经见过Sobel的技术爱好者:
The post描述了(不是太多)有关如何实现过滤器的详细信息,并为演示目的共享Ruby源代码:
Input/Output :
Sobel Operator维基百科页面描述了如何执行它 . 有其他运营商,如Roberts cross和Prewitt
使用卷积运算,您可以通过更改内核矩阵来切换方法 . 下面,使用Marvin Framework实施Sobel和Convolution可能对您有所帮助 .
Sobel:
Convolution:
Gx估计x方向(列)的梯度,Gy估计y方向的梯度(行) . 因此,Gy检测水平线,Gx检测垂直线 .
当然,您可以使用OpenCV:
输入输出:
R markdown 文件中的所有上述步骤 . 希望这使它更直观,更容易理解 . 我需要实现一个sobel过滤器,这个页面帮助我理解了我在完成它时遇到一些麻烦的概念 . 所以把它放在一个地方希望它有所帮助 .
http://rpubs.com/ghub_24/420754