90x90 的图像被分成 8 个链码方向的 9x9 块,并且需要最小化特征下采样!如何使用 5x5 高斯滤波器将图像下采样为 5x5 块。java中是否有实现高斯滤波器的库函数。
问问题
714 次
1 回答
0
我不太清楚您要做什么,但仅用于调整图像大小,您可以使用AffineTransform at = AffineTransform.getTranslateInstance(x, y);
然后at.scale(scaleX, scaleY);
,但我想您实际上想要模糊图像。这实际上是一个非常简单的过程,我曾经为此编写了一个方法。
public BufferedImage blur(int range, int angle)
{
BufferedImage b = new BufferedImage(main_image.getWidth() * 2, main_image.getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g = b.createGraphics();
for(int x = 0; x < main_image.getWidth(); x++)
{
for(int y = 0; y < main_image.getHeight(); y++)
{
int red[] = new int[range * 2], green[] = new int[range * 2], blue[] = new int[range * 2];
int pixels[] = new int[range * 2];
for(int i = 0; i < pixels.length; i++)
{
pixels[i] = main_image.getRGB(clamp(x - clamp(range / 2, 0, range) + i, 0, main_image.getWidth() - 1), clamp(y - clamp(range / 2, 0, range) + (int)(i * Math.toRadians(angle)), 0, main_image.getHeight() - 1));
red[i] = (pixels[i] >> 16) & 0xff;
green[i] = (pixels[i] >> 8) & 0xff;
blue[i] = (pixels[i]) & 0xff;
}
int red_t = 0, green_t = 0, blue_t = 0;
for(int i = 0; i < pixels.length; i++)
{
red_t += red[i];
green_t += green[i];
blue_t += blue[i];
}
int r = red_t / (range * 2);
int gr = green_t / (range * 2);
int bl = blue_t / (range * 2);
//System.out.println(r + ", " + gr + ", " + bl);
g.setColor(new Color(r, gr, bl));
g.fillRect(x, y, 1, 1);
}
}
g.dispose();
return b;
}
这实际上是一个非常简单的线性拟合器。对于高斯滤波器,您必须将pixels
、red
和变量转换为二维数组,然后对 y 轴重复整个过程green
。blue
如果您了解高斯蓝色的工作原理,那么您应该可以毫无问题地实现它或将其更改为高斯滤波器。如果你愿意,你可以问我有关它的东西。
于 2020-07-24T21:05:40.193 回答