如何用sobel-kernel处理卷积后的输出值

问题描述 投票:0回答:1

我正在尝试编写一个可以检测图像边缘的程序(练习C ++)。我正在使用SFML加载图像。

我尝试了Sobel操作,并对输出值感到困惑。我从当前像素周围的像素获得强度值,并将其与Sobel内核的适当值相乘。这些值加在一起。

我的问题是,输入强度值的范围是0到255,但我的输出值可以从一些负值(可以小于-255)到某个正值(可以大于255)。

我找不到任何关于如何将它们转换为灰度值的提示;我的输入图像是灰度,意思是r,g,b是相似的。作为Sobel矩阵/内核,我使用了自定义矩阵类。

// The Sobel-kernel-x looks like that
int kernel_x[] = { 1, 0, -1,
                  2, 0, -2,
                  1, 0, -1 }



for (int y = 1; y < height - 1; y++)
{
    for (int x = 1; x < width - 1; x++)
    {
        int sum = 0;
        for (int i = -1; i <= 1; i++)
        {
            for (int j = -1; j <= 1; j++)
            {
                sum += img.getPixel(x + j, y + i).r * sobelkernel_x.at(j + 1, i + 1);
            }
        }
        //std::cout << sum << std::endl;
        cur_img->setPixel(x, y, sf::Color(sum, sum, sum));
    }
}
c++ edge-detection sobel
1个回答
0
投票

尝试这样的事情:

int MIN_SOBEL_VAL = minValue(sobelMatrix[][]);
int MAX_SOBEL_VAL = maxValue(sobelMatrix[][]);

int outputMatrix[][];

void normalizer(sobelMatrix, MIN_SOBEL_VAL, MAX_SOBEL_VAL, outputMatrix, 0, 255) {
    for(i = 0 -> N)
        for(j = 0 -> M)
            outputMatrix[i][j] = g(sobelMatrix[i][j],MIN_SOBEL_VAL, MAX_SOBEL_VAL, 0, 255);
}

其中g(n,a,b,x,y)是一个线性映射区间a,b => x,y的函数。

对于你的情况;

g(...) = (n - MIN_SOBEL_VAL)/(MAX_SOBEL_VAL - MIN_SOBEL_VAL) * (255 - 0)

这会将您的sobelMatrix映射到输出矩阵,其值介于255-0之间。

© www.soinside.com 2019 - 2024. All rights reserved.