Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 16位灰度图像的Sobel边缘检测输出 我在C++和C中看到了很多Sobel边缘检测操作,但是我很难把代码转换成16位图形。我看到的大部分代码都是编程在R.G.B风格的位图上运行的。我的图形是一个ushort[]数组,每行的强度值为col像素_C#_Image_Image Processing_Graphics_Edge Detection - Fatal编程技术网

C# 16位灰度图像的Sobel边缘检测输出 我在C++和C中看到了很多Sobel边缘检测操作,但是我很难把代码转换成16位图形。我看到的大部分代码都是编程在R.G.B风格的位图上运行的。我的图形是一个ushort[]数组,每行的强度值为col像素

C# 16位灰度图像的Sobel边缘检测输出 我在C++和C中看到了很多Sobel边缘检测操作,但是我很难把代码转换成16位图形。我看到的大部分代码都是编程在R.G.B风格的位图上运行的。我的图形是一个ushort[]数组,每行的强度值为col像素,c#,image,image-processing,graphics,edge-detection,C#,Image,Image Processing,Graphics,Edge Detection,下面是我的代码:问题是,它不是很有效。。。有了软糖因素,它可能会找到边缘,但也会发现很多噪音 但是,如果我将原始文件保存为JPG,并将其运行到另一个接受位图的Sobel边缘检测器C代码中,它会更好。。。几乎没有噪音!我的16位灰度版不是应该更好吗?!但一定是我的代码不符合标准。我不明白逻辑 public void sobel() { ushort[] pixels = new ushort[9]; ushort[,] imageData = im

下面是我的代码:问题是,它不是很有效。。。有了软糖因素,它可能会找到边缘,但也会发现很多噪音

但是,如果我将原始文件保存为JPG,并将其运行到另一个接受位图的Sobel边缘检测器C代码中,它会更好。。。几乎没有噪音!我的16位灰度版不是应该更好吗?!但一定是我的代码不符合标准。我不明白逻辑

    public void sobel()
    {

        ushort[] pixels = new ushort[9];
        ushort[,] imageData = image_array[0].GetArray();
        ushort[,] imageOut = (ushort[,])imageData.Clone();
        uint xDim = (ushort)(imageData.GetLength(1) - imageData.GetLength(1) % regions);
        uint yDim = (ushort)(imageData.GetLength(0) - imageData.GetLength(0) % regions);

        double intensityX = 0.0;
        double intensityY = 0.0;
        double intensityTotal = 0.0;
        int limit = 1000000; //Just arbitrary junk number

        int filterOffset = 1;

        for (int offsetY = filterOffset; offsetY <
            yDim - (filterOffset+1); offsetY++)
        {

            for (int offsetX = filterOffset; offsetX <
                xDim - (filterOffset+1); offsetX++)
            {
                //intensityX = intensityY = 0;
                //intensityTotal = 0;

                pixels[0] = imageData[offsetY - 1, offsetX - 1];
                pixels[1] = imageData[offsetY - 1, offsetX];
                pixels[2] = imageData[offsetY - 1, offsetX + 1];
                pixels[3] = imageData[offsetY, offsetX - 1];
                pixels[4] = imageData[offsetY, offsetX];
                pixels[5] = imageData[offsetY, offsetX + 1];
                pixels[6] = imageData[offsetY + 1, offsetX - 1];
                pixels[7] = imageData[offsetY + 1, offsetX];
                pixels[8] = imageData[offsetY + 1, offsetX + 1];

                intensityX = pixels[8] + 2 * pixels[5] + pixels[2] - pixels[0] - 2 * pixels[3] - pixels[6];
                intensityY = pixels[8] + 2 * pixels[7] + pixels[6] - pixels[2] - 2 * pixels[1] - pixels[0];

                //intensityTotal = Math.Sqrt((intensityX * intensityX) + (intensityY * intensityY));
                //intensityTotal = Math.Abs(intensityX) + Math.Abs(intensityY);
                intensityTotal = intensityX * intensityX + intensityY * intensityY;
                //int sobel = (int)Math.Sqrt((xSobel * xSobel) + (ySobel * ySobel));

                //if (intensityTotal > MaximumValue)
                  //  intensityTotal = MaximumValue; //Presumably Black

                //if (intensityTotal < -1000) //1000 fudgefactor ...still not working correctly
                  //  intensityTotal = MinimumValue; //Presumably White
                //if (intensityTotal < (MinimumValue - 1000))
                  //  intensityTotal = MaximumValue;

                if (intensityTotal > limit)
                    imageOut[offsetY, offsetX] = MinimumValue;
                else
                    imageOut[offsetY, offsetX] = MaximumValue;

                //imageOut[offsetY, offsetX] = (ushort)intensityTotal;
            }

        }

        SetImageArrayItem(ImageDataIndex.RAWData, new DiskBackedArray(imageOut));

    }

只需假设‘image_array’、xDim、yDim是给定的。你会注意到一些被注释掉的其他尝试。

Sobel和其他基于梯度的过滤器受到噪声的影响。您可以使用高斯平滑对图片进行预滤波并比较结果。请注意,平方差的极限=1000000对应于大约1000的差值大小-这对于16位最大值=65535图片来说是相当小的值。
保存在JPG使图片更加模糊-锐利的边缘被涂抹,高频噪声被降低。因此,请使用温和的平滑和限制。

我已经摆弄了一段时间了。但是,我突然清醒地意识到,我提到的另一个软件,它让我看起来很容易,它将图像的大小更改为我看到的画布大小-呸。所以它不是处理5700*3700的图像,而是处理550*780,当然我是四舍五入,但你得到了图片。所以是的,它是平滑的。。。我还没有完全完成这项工作,但最终,我接受了教育。上面的代码完全不是我现在使用的代码,但我正在按照你说的做:使用高斯平滑,而不是实际应用Kirsh边缘检测。。。谢谢