Prewitt 滤波器,边缘检测

Posted

技术标签:

【中文标题】Prewitt 滤波器,边缘检测【英文标题】:Prewitt filter, edge detection 【发布时间】:2016-12-23 23:27:47 【问题描述】:

我有实现 Prewitt 边缘检测的代码。我需要做的是只用一个缓冲区来实现它,也就是说,我不会创建图像的副本,而是编辑原始图像。因此,如果我想更改值为 78 的像素,我不能输入新值,例如100 直到所有周围像素的读取值都为 78。Color values of the pixels。我已经尝试了一整天但无法弄清楚,如果有人能给我写一些伪代码,我将非常感激

void filter_serial_prewitt(int *inBuffer, int *outBuffer, int width, int height)
   for (int i = 1; i < width - 1; i ++) 
     for (int j = 1; j < height - 1; j ++) 
        int Fx = 0;
        int Fy = 0;
        int F = 0;
        for (int m = -1; m <= 1; m++) 
            for (int n = -1; n <= 1; n++) 
                Fx += inBuffer[(j + n) * width + (i + m)] * n;
                Fy += inBuffer[(j + n) * width + (i + m)] * m;
            
        
            F = abs(Fx) + abs(Fy);

            if (F < THRESHOLD)
                outBuffer[j * width + i] = 255;
             else
                outBuffer[j * width + i] = 0;
            
       
   

【问题讨论】:

为什么只需要 1 个缓冲区?并非每种图像处理技术都可以就地完成,如果您可以将它们分成多个通道(尤其是某些类型的卷积),许多技术会更有效。一种替代方法是使用只有几行长的缓冲区,而不是整个第二张图像。这是一个可以接受的答案吗? @user1118321 好吧,我知道使用两个缓冲区会更容易更好,但这就是我分配的重点。只编辑原始图像。好吧,我可能需要一些缓冲区来保留这些值,直到它们可以替换原始值,但正如我所说,我不知道该怎么做。如果这改变了任何事情,我必须以串行和并行的方式进行。 【参考方案1】:

要了解 Prewitt 运算符的一件事是它是可分离的。 See the Wikipedia article了解详情。

要计算单个输出行,您需要执行以下操作(伪代码):

int* buffer = malloc (sizeof(int) * width);
for (int i = 0; i < width; i++)

    // Do the vertical pass of the convolution of the first 3 rows into
    // the buffer.
    buffer [ i ] = vertical_convolve(inBuffer [ i ], vertical_kernel);


// Next, do the horizontal convolution of the first row. We need to 
// keep the previous value in a temp buffer while we work
int temp0 = horizontal_convolve(buffer [ 0 ], horizontal_kernel);
for (int i = 1; i < width; i++)

    int temp1 = horizontal_convolve(buffer[ i ], horizontal_kernel);
    inBuffer [ i - 1 ] = temp0;
    temp0 = temp1;

这需要一个 1 像素高和图像宽度的缓冲区。

要处理整个图像,您需要保留上述缓冲区中的 2 个,并且在计算第三行上的一个像素后,您可以将图像第一行的第一个像素替换为第一个像素第一个缓冲区。然后你可以将新计算的值放入缓冲区。

因此,在这种情况下,您不会保留整个第二张图像,而是需要保留大约 2 个与图像一样宽的 1 像素高的缓冲区。

【讨论】:

以上是关于Prewitt 滤波器,边缘检测的主要内容,如果未能解决你的问题,请参考以下文章

python图像处理(prewitt算子)

使用 Matlab 实现的 Prewitt 边缘检测器提供的边缘比内置函数厚

边缘检测算子中抗噪性能最好的是?

图像边缘检测:Canny算子、Prewitt算子和sobel算子

图片处理-opencv-10.图像锐化与边缘检测

边缘检测算子都有哪些?它们各有啥优缺点