如何更改图像位深度?

时间:2019-06-13 08:55:34

标签: java opencv

我正在使用Mindtct(NBIS软件)。 运行程序时,出现以下错误:

  

错误:read_and_decode_grayscale_image:D:\ Users \ Malik \ Desktop \ cd642acd \ cd642acd_1 \ I1_S1.png:图像深度:24!= 8

Mindtct是一种提取指纹细节的工具:它仅接受DPI等于8位的灰度图像,但我使用的指纹传感器显然生成的DPI等于24位的图像。

我的问题是: 如何在JAVA(OpenCV),C ++或什至另一种语言中更改图像深度(将其从24bits减少到8bits)?

./mindtct.exe -m1 $pathImage $imageNameResult

1 个答案:

答案 0 :(得分:0)

解决方案:

  

第一种方法:(此版本需要OpenCV .jar)

public static void main(String args[]) {
   System.loadLibrary( Core.NATIVE_LIBRARY_NAME );
   String file = "AbsolutePathToTheSRCImage2.png";
   Mat src = Imgcodecs.imread(file);
   Mat dst = new Mat();
   Imgproc.cvtColor(src, dst, Imgproc.COLOR_RGB2GRAY);
   Imgcodecs.imwrite("AbsolutePathToTheDSTImage2", dst);
}

如果不想使用OpenCV库,则可以使用以下经典方法:

Here is the mathematical formula of conversion

  

第二种方法:

BufferedImage img = new BufferedImage(width, height,BufferedImage.TYPE_BYTE_GRAY);
WritableRaster raster = img.getRaster();
WritableRaster rasterJPEG = image.getRaster();

for(int h=0; h<height; h++)
   for(int w=0; w<width; w++) {
      int[] p = new int[4];
       rasterJPEG.getPixel(w, h, p);
       p[0] = (int) (0.3 * p[0]);
       p[1] = (int) (0.59 * p[1]);
       p[2] = (int) (0.11 * p[2]);
       int y = p[0] + p[1] + p[2];
       raster.setSample(w,h,0,y);
    }
 return img;