如何改进java中的invert+grayscale操作符?

zf2sa74q  于 2021-07-09  发布在  Java
关注(0)|答案(3)|浏览(336)

我想反转和灰度图像。这是我的原图:

下面是我想要实现的最终结果(使用paint.net生成):

然而,使用互联网上的一些(基本的?)java代码,我只能得到以下图片:

以下是我使用的代码:

  1. private static final byte[] invertTable;
  2. static {
  3. invertTable = new byte[256];
  4. for (int i = 0; i < 256; i++) {
  5. invertTable[i] = (byte) (255 - i);
  6. }
  7. }
  8. private static BufferedImage grayScale(BufferedImage source) {
  9. ColorConvertOp grayScale = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
  10. return grayScale.filter(source,null);
  11. }
  12. private static BufferedImage invertImage(final BufferedImage src) {
  13. final int w = src.getWidth();
  14. final int h = src.getHeight();
  15. final BufferedImage dst = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
  16. final BufferedImageOp invertOp = new LookupOp(new ByteLookupTable(0, invertTable), null);
  17. return invertOp.filter(src, dst);
  18. }
  19. // ...
  20. BufferedImage sourceImage = ...
  21. BufferedImage convertedImage = grayScale(invertImage(sourceImage));

如何改进上述代码?

8dtrkrch

8dtrkrch1#

使用 Imgproc 以及 Core ,我做到了

  1. Mat src = new Mat();
  2. Mat gray = new Mat();
  3. src = Highgui.imread("...");
  4. Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);
  5. Core.bitwise_not(gray, gray);
  6. Highgui.imwrite("...", gray);

更接近一些,虽然不完全相同:

j13ufse2

j13ufse22#

虽然我不熟悉colorconvertop,但我怀疑它将彩色图像转换为灰度的方式与paint.net不同。没有正确的方法。
看看黄色的。黄色应该是深灰色还是浅灰色?看起来paint.net认为它是亮的,colorconvertop认为它是暗的。
试着通过平均红/绿/蓝来进行转换。

  1. (red+green+blue)/3
mwkjh3gx

mwkjh3gx3#

标题上写着opencv,但是有一个boofcv的标签。下面是如何在boofcv中实现的:

  1. BufferedImage orig = UtilImageIO.loadImage("filename");
  2. ImageUInt8 gray = ConvertBufferedImage.convertFrom(orig, (ImageUInt8) null);
  3. ImageUInt8 inverted = new ImageUInt8(gray.width,gray.height);
  4. GrayImageOps.invert(gray,255,inverted);

相关问题