【发布时间】:2017-04-04 14:50:25
【问题描述】:
下面的代码是一个图像处理例程。 x 和 y 表示构成图像的所有像素的坐标。基本情况如下:
- x, y - 每个像素的坐标。
- imgH, imgW - 图像的高度和宽度,以像素为单位
- r, g, b - 每个像素的红色、绿色和蓝色级别
代码使用双 for 循环对图像中的每个像素进行处理。我想在这个 for 循环中做的是对于每个像素,我想平均 8 个周围像素的 r、g、b 值,并将其平均为中心像素的值。这将产生模糊图像的效果。有人可以帮我吗?
protected void proc_17() {
info = "";
for (int y = 0; y < imgH; y++) {
for (int x = 0; x < imgW; x++) {
int xNext = (x+1) % imgW;
int yNext = (y+1) % imgH;
float r = (imgOld.getR(xNext, yNext) + imgOld.getR(xNext, yNext)) / 8;
float g = (imgOld.getG(xNext, yNext) + imgOld.getG(xNext, yNext)) / 8;
float b = (imgOld.getB(xNext, yNext) + imgOld.getB(xNext, yNext)) / 8;
imgNew.setR(x, y, r);
imgNew.setG(x, y, g);
imgNew.setB(x, y, b);
}
}
}
【问题讨论】:
-
您将需要循环两次,一次用于计算新值,一次用于应用它们。否则将使用一些已经模糊的像素进行计算
-
为什么不用
imgOld.getR(xNext, yNext) / 4;替换(imgOld.getR(xNext, yNext) + imgOld.getR(xNext, yNext)) / 8;? -
除以 4 只是将每个像素的 RGB 值相除,使它们变低,这反过来又使图像变暗,因为值被均匀地减小。
-
是的,但是您正在将此调用
imgOld.getR(xNext, yNext)返回的值添加到自身,因为您再次进行了完全相同的调用。然后你将它除以 8。本质上,你正在做的是:(2 * imgOld.getR(xNext, yNext)) / 8;
标签: java image for-loop image-processing pixels