Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.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
实现一个平均过滤器不会';不能在OpenCV中工作,但可以在Java中工作_Java_Opencv - Fatal编程技术网

实现一个平均过滤器不会';不能在OpenCV中工作,但可以在Java中工作

实现一个平均过滤器不会';不能在OpenCV中工作,但可以在Java中工作,java,opencv,Java,Opencv,这是多么痛苦啊。基本上,我所要做的就是在图像上实现一个简单的模糊过滤器。我使用的是同一幅24位位图(Lena512.bmp)。现在的问题是,我编写的Java实现工作正常。然而,C实现并没有模糊我想要的区域,而是使区域变暗,看起来很奇怪。我不太确定这是否与RGB(BGR)转换有关。我能把一个特定的像素转换成一种颜色,然后把同样的颜色读回来 我想学习有关图像处理的知识,而不是一切都依赖OpenCV库,只想从我的网络摄像头和磁盘上抓取图片 这是我的Java实现。Img包含24位lena512.bmp

这是多么痛苦啊。基本上,我所要做的就是在图像上实现一个简单的模糊过滤器。我使用的是同一幅24位位图(Lena512.bmp)。现在的问题是,我编写的Java实现工作正常。然而,C实现并没有模糊我想要的区域,而是使区域变暗,看起来很奇怪。我不太确定这是否与RGB(BGR)转换有关。我能把一个特定的像素转换成一种颜色,然后把同样的颜色读回来

我想学习有关图像处理的知识,而不是一切都依赖OpenCV库,只想从我的网络摄像头和磁盘上抓取图片

这是我的Java实现。Img包含24位lena512.bmp

private void applyFilter()
{       
    //Apply the filter 3 times
    for (int n = 0; n < 3; n++) {
        for (int y=100; y < 300; y++) {
            for (int x=100; x<300; x++) {
                int r = 0,g = 0,b = 0;
                    for (int j = -1; j <= 1; j++) {
                        for (int k=-1; k<=1; k++) {
                            int pixel = img.getRGB(x + k, y + j);
                            r += (new Color(pixel).getRed());
                            g += (new Color(pixel).getGreen());
                            b += (new Color(pixel).getBlue());
                        }
                    }
                    r = r / 9; //Assume a 3x3 matrix, to average out.
                    g = g / 9;
                    b = b / 9;
                    img.setRGB(x, y, new Color(r,g,b).getRGB());
                }
            }
        }
}
我的getPixel和getPixel工作正常,因为我能够设置和获取它们(我知道RGB-->BGR字节顺序,这不是问题所在)。很明显,我遗漏了一些东西

谢谢大家

我已链接(我的代表太低)该问题的图片。左边是java实现,右边是OpenCV实现


仔细查看这段应该累积强度值的代码:

getPixel(img,x + nx,y + ny,&r, &g, &b);
r += r;
...
getPixel
在每次迭代中不断覆盖累加器变量
r
g
b
。这意味着,在查询过滤器区域的最后一个像素之后
r
g
b
将只保存最后一个像素的值
r+=r
和最终
r=r/9
意味着,最终每个过滤像素的强度大约只有其原始图像右下相邻像素强度的九分之二。因此,该区域变得非常黑暗

尝试使用单独的变量来接收过滤器区域中每个像素的强度值,例如
curr\u r
curr\u g
、和
curr\u b

int r = 0, g = 0, b = 0;
for ( ny = -1; ny <= 1; ny ++) {
    for ( nx = -1; nx <= 1; n x++) {
        int curr_r, curr_g, curr_b; 
        getPixel(img, x + nx, y + ny, & curr_r, & curr_g, &curr_b);
        r += curr_r; 
        g += curr_g;
        b += curr_b;
    }
}
r = r / 9;
g = g / 9;
b = b / 9;
intr=0,g=0,b=0;

对于(ny=-1;ny排序。我真傻。我用的是无符号字符,而不是int。
当我睡眠不足时会发生什么:-D.

谢谢你发现了这个小问题。在做了这些改变后,我仍然得到与以前完全相同的图像。真是太痛苦了。
getPixel(img,x + nx,y + ny,&r, &g, &b);
r += r;
...
int r = 0, g = 0, b = 0;
for ( ny = -1; ny <= 1; ny ++) {
    for ( nx = -1; nx <= 1; n x++) {
        int curr_r, curr_g, curr_b; 
        getPixel(img, x + nx, y + ny, & curr_r, & curr_g, &curr_b);
        r += curr_r; 
        g += curr_g;
        b += curr_b;
    }
}
r = r / 9;
g = g / 9;
b = b / 9;