gpt4 book ai didi

java - 实现平均滤波器在 OpenCV 中不起作用,但在 Java 中起作用

转载 作者:行者123 更新时间:2023-12-02 06:36:28 25 4
gpt4 key购买 nike

这是多么痛苦的事情啊。基本上,我想做的就是在图像上实现一个简单的模糊滤镜。我使用相同的图像,即 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());
}
}
}
}

我的 C 实现如下所示。 Img 包含 24 位 lena512.bmp。

void applyAverage(IplImage *img)
{
int x,y;
int nx, ny;

for ( y = 100; y < 400; y++) {
for ( x = 100; x < 400; x++) {
unsigned char r,g,b;
for ( ny = -1; ny <= 1; ny++) {
for ( nx = -1; nx <= 1; nx++) {
getPixel(img,x + nx,y + ny,&r, &g, &b);
r += r;
g += g;
b += b;
}
}
r = r / 9;
g = g / 9;
b = b / 9;
setPixel(img, x, y, &r, &g, &b);
}
}
}

在 C 实现的 main 方法中,我按如下方式加载图像:

IplImage *frame = cvLoadImage("lena512.bmp",1);

我的 getPixel 和 getPixel 可以工作,因为我能够设置和获取它们(我知道 RGB ---> BGR 字节顺序,这不是问题)。显然,我在这里遗漏了一些东西。

谢谢大家。

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

http://i176.photobucket.com/albums/w189/Phil128/Problem_zps431a4a4f.png

最佳答案

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

getPixel(img,x + nx,y + ny,&r, &g, &b);
r += r;
...

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

尝试使用单独的变量来接收过滤区域中每个像素的强度值,例如 curr_r , curr_g ,和curr_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;

在这里,getPixel会将强度值放入 curr_r ,例如,则 curr_r添加到累积变量 r .

另一件事。您正在传递 r 的地址, g ,和bsetPixelsetPixel(img, x, y, & r, & g, & b); 。这可能是正确的方法,但我宁愿期望 setPixel接受 setPixel(img, x, y, r, g, b); 中的值。值得仔细检查该函数的声明。

关于java - 实现平均滤波器在 OpenCV 中不起作用,但在 Java 中起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19601541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com