如何处理与 sobel-kernel 卷积后的输出值
How to treat the ouput-values after convolution with sobel-kernel
我正在尝试编写一个可以检测图像边缘的程序(练习 C++)。我正在使用 SFML 加载图像。
我尝试了 Sobel 运算,但对输出值感到困惑。
我从当前像素周围的像素中获取强度值,并将这些值与 Sobel 内核的适当值相乘。这些值加在一起。
我的问题是,输入强度值的范围是 0 到 255,但我的输出值范围是从某个负值(可以小于 -255)到某个正值(可以大于 255)。
我找不到任何关于如何将它们转换为灰度值的提示;我的 InputImage 是 Greyscale,意思是 r,g,b 是相似的。
作为 Sobel-matrix/kernel,我使用了自定义矩阵 Class。
// 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));
}
}
尝试这样的事情:
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 映射到 outputMatrix,其值介于 255-0 之间。
我正在尝试编写一个可以检测图像边缘的程序(练习 C++)。我正在使用 SFML 加载图像。
我尝试了 Sobel 运算,但对输出值感到困惑。 我从当前像素周围的像素中获取强度值,并将这些值与 Sobel 内核的适当值相乘。这些值加在一起。
我的问题是,输入强度值的范围是 0 到 255,但我的输出值范围是从某个负值(可以小于 -255)到某个正值(可以大于 255)。
我找不到任何关于如何将它们转换为灰度值的提示;我的 InputImage 是 Greyscale,意思是 r,g,b 是相似的。 作为 Sobel-matrix/kernel,我使用了自定义矩阵 Class。
// 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));
}
}
尝试这样的事情:
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 映射到 outputMatrix,其值介于 255-0 之间。