Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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
Image processing 什么';这是标准化卷积滤波器的正确方法吗?_Image Processing_Edge Detection - Fatal编程技术网

Image processing 什么';这是标准化卷积滤波器的正确方法吗?

Image processing 什么';这是标准化卷积滤波器的正确方法吗?,image-processing,edge-detection,Image Processing,Edge Detection,我按照指示去做。但我的结果并不正确。我正在使用这个内核: -1 -1 -1 -1 8 -1 -1 -1 -1 这意味着给定卷积的和将在-8和8之间,假设我已经规范化了输入(0-255->0-1)。然后我做卷积。然后我发现我的值在最小值和最大值之间的百分比。例如,对于这个内核,我的最小值是-8,最大值是8。因此,如果值为0,则为50%,即255*.5=127.5。但这显然是不对的,它给出的图像大多是灰色的。不是灰色的部分仍然是单色的,即使我在每个通道上分别运行内核 static int Ev

我按照指示去做。但我的结果并不正确。我正在使用这个内核:

-1 -1 -1
-1  8 -1
-1 -1 -1

这意味着给定卷积的和将在-8和8之间,假设我已经规范化了输入(0-255->0-1)。然后我做卷积。然后我发现我的值在最小值和最大值之间的百分比。例如,对于这个内核,我的最小值是-8,最大值是8。因此,如果值为0,则为50%,即255*.5=127.5。但这显然是不对的,它给出的图像大多是灰色的。不是灰色的部分仍然是单色的,即使我在每个通道上分别运行内核

static int EvaluateKernelAtPoint(位图、矩阵核、int x、int y、函数视密度)
{
双和=0;
for(int a=0;a
没有正确的方法进行规范化,因为范围取决于内容

在良好的RGB图像中,如果动态范围得到很好的调整,则值的范围通常为[0255]

但是这种拉普拉斯滤波器的输出,可以看作原始图像和平滑图像之间的差异,通常具有更小的振幅。但这取决于局部变化:已经平滑的图像将不会给出响应,而噪声(尤其是椒盐)会产生巨大的值

您还需要决定如何处理负值:移位使零显示为中灰色,钳制为零或取绝对值

选择最小-最大范围并将其映射到0-255是一个选项,但会导致“浮动”零和不受控制的增益。我更愿意为一组相同来源的图像设置一个恒定增益


最后但并非最不重要的一点是,直方图均衡化是另一种选择。

这些极端情况极不可能出现。您确实希望将0设置为127或128,然后您可以选择一个缩放比例,使您的图像看起来很好。一种方法是在输出图像中找到最小值和最大值。“不是灰色的部分仍然是单色的”:不要期望拉普拉斯输出显示有意义的颜色。另外,不建议对三个通道应用不同的增益系数,因为这会引入偏差。好吧,我将尝试修改这些值。不过,它现在被搁置了。快速提问,我感到困惑的原因是,我用-1-1-1-18-1-1-1-1-1卷积滤波器将我的图像与浏览器中的图像进行比较。猜猜浏览器可能在这里做什么?是的,我觉得不错。我就是想不出怎么用我自己的代码来做。如果我遵循mozilla上的步骤(指向w3c规范,我只阅读了其中的几个部分),我不会得到相同的结果。我认为我问题中的代码是对伪代码的忠实解释(偏差为0,除数为1,所以我把它们排除在这个问题之外)。这就是为什么我对结果不匹配感到困惑。@Cogito-ergocogiosum:你在向谁讲话?@Cogito-ergocogiosum:你在问“你的问题解决了吗?”。我没有问题,我的回答解释了选项是什么。这令人困惑。
    static int EvaluateKernelAtPoint(Bitmap bitmap, Matrix<double> kernel, int x, int y, Func<int, int, int> onGetIntensity)
    {
        double sum = 0;
        for (int a = 0; a < kernel.ColumnCount; a++)
        {
            for (int b = 0; b < kernel.RowCount; b++)
            {
                var xn = x + a - 1;
                var yn = y + b - 1;

                var intensity = (double)onGetIntensity(xn, yn); // returns R,G, or B color channel at that pixel
                intensity /= 255; // intensity is 0-1
                sum += intensity * kernel.At(a, b);
            }
        }

        var result = (sum - (-8d)) / (8d - (-8d)); // find the % between the min and max of -8 and 8
        result *= 255; // bring it back to 0-255
    }