【发布时间】:2018-04-08 14:08:05
【问题描述】:
这是我在灰度图像上执行的 sobel 过滤器功能。显然我的计算不正确,因为我不断得到全黑图像。我已经上交了项目,但结果不正确让我很困扰。
int sobelH[3][3] = { -1, 0, 1,
-2, 0, 2,
-1, 0, 1 },
sobelV[3][3] = { 1, 2, 1,
0, 0, 0,
-1, -2, -1 };
//variable declaration
int mag;
int pix_x, pix_y = 0;
int img_x, img_y;
for (img_x = 0; img_x < img->x; img_x++)
{
for (img_y = 0; img_y < img->y; img_y++)
{
pix_x = 0;
pix_y = 0;
//calculating the X and Y convolutions
for (int i = -1; i <= 1; i++)
{
for (int j = -1; j <= 1; j++)
{
pix_x += (img->data[img_y * img->x + img_x].red + img->data[img_y * img->x + img_x].green + img->data[img_y * img->x + img_x].blue) * sobelH[1 + i][1 + j];
pix_y += (img->data[img_y * img->x + img_x].red + img->data[img_y * img->x + img_x].green + img->data[img_y * img->x + img_x].blue) * sobelV[1 + i][1 + j];
}
}
//Gradient magnitude
mag = sqrt((pix_x * pix_x) + (pix_y * pix_y));
if (mag > RGB_COMPONENT_COLOR)
mag = 255;
if (mag < 0)
mag = 0;
//Setting the new pixel value
img->data[img_y * img->x + img_x].red = mag;
img->data[img_y * img->x + img_x].green = mag;
img->data[img_y * img->x + img_x].blue = mag;
}
}
【问题讨论】:
-
不知道这是否能解决您的问题,但您有
pix_x和pix_y为无符号但使用可能产生负值的计算。 -
它不能解决问题,但感谢任何帮助@vu1p3n0x
-
请修改 this=> for (img_x = 0; img_x x; img_x++)
-
另外每次迭代都需要将rgb转为灰度->然后求卷积算子在水平和垂直方向上的幅度。
-
@Programmer 我以为我必须自己为我的项目做这件事,但我也从未使用过 OpenCV,所以我会检查一下。
标签: c++ image-processing convolution ppm sobel