索贝尔图像处理

时间:2015-10-20 16:08:23

标签: c#

我的算法输出错误。我尝试了很多解决方案,但没有任何结果。 查看我的结果。 SourceImage

I'm sorry Lena

for (int x = 1; x < fimage.Bitmap.Width - 1; x++)
{
    for (int y = 1; y < fimage.Bitmap.Height - 1; y++)
    {
        double sumX = 0, sumY = 0, sum = 0;

        for ( int i = -1; i <= 1; i++ )
        {
            for ( int j = -1; j <= 1; j++ )
            {
                sumX += fimage[y + i, x + j].R * kernel1[i + 1, j + 1];
                sumY += fimage[y + i, x + j].R * kernel2[i + 1, j + 1];
            }
        }

        sum = Math.Sqrt(sumX * sumX + sumY * sumY);
        sum = sum > 255 ? 255 : sum < 0 ? 0 : sum;
        fimage[x, y] = Color.FromArgb((byte)sum, (byte)sum, (byte)sum);
    }
}

1 个答案:

答案 0 :(得分:0)

有两件事可疑:

    for ( int j = -1; j <= 1; j++ )
    {
        sumX += fimage[y + i, x + j].R * kernel1[i + 1, j + 1];
        sumY += fimage[y + i, x + j].R * kernel2[i + 1, j + 1];
    }

你只尊重图像中的红色成分,为什么? 另一个重要的事情是在迭代它时改变输入图像:

                sum = Math.Sqrt(sumX * sumX + sumY * sumY);
                sum = sum > 255 ? 255 : sum < 0 ? 0 : sum;
                fimage[x, y] = Color.FromArgb((byte)sum, (byte)sum, (byte)sum);

您应该将值保存到其他输出图像(使用源图像中的尺寸创建new Bitmap(fimage.Width, fimage.Height))。这可以解释你图片中奇怪的对角线对称,其中基本上是对方的对称副本。