簡體   English   中英

在C ++中執行Sobel篩選器功能時我做錯了什么

[英]What am I doing wrong when executing the sobel filter function in c++

這是我在灰度圖像上執行的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;
    }
}

盡管您的代碼可以使用一些改進,但是主要原因是您以常數img_yimg_x計算卷積。 您需要做的是:

pix_x += (img->data[img_y * img->x + img_x + i].red + img->data[img_y * img->x + img_x + i].green + img->data[img_y * img->x + img_x + i].blue) * sobelH[1 + i][1 + j];

實際上,Sobel卷積是對稱的,因此,如果使用恆定圖像計算卷積,則只會產生黑色。

請注意,在上面的示例中,我沒有考慮圖像的邊框。 您應該確保不要訪問像素陣列之外的像素。

另一個錯誤是您在輸入圖像中書寫。 您在位置(x,y)處進行寫入,然后使用(x,y)處的修改后的值來計算位置(x + 1,y)的過濾結果,這是使用錯誤的值。

您需要將結果寫入新圖像。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM