Java 如何更改图像位深度?

Java 如何更改图像位深度?,java,opencv,Java,Opencv,我正在使用Mindtct(NBIS软件)。 运行该程序时,出现以下错误: 错误:读取并解码灰度图像:D:\Users\Malik\Desktop\cd642acd\cd642acd\u 1\I1\u S1.png:图像深度:24!=八, Mindtct是一种用于提取指纹细节的工具:它只接受DPI等于8位的灰度图像,但我使用的指纹传感器显然可以生成DPI等于24位的图像 我的问题是: 如何在java(OpenCV)或C++中,甚至在另一种语言中改变图像深度(从24位减少到8位)? /mindtct

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

错误:读取并解码灰度图像:D:\Users\Malik\Desktop\cd642acd\cd642acd\u 1\I1\u S1.png:图像深度:24!=八,

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

我的问题是: 如何在java(OpenCV)或C++中,甚至在另一种语言中改变图像深度(从24位减少到8位)?
/mindtct.exe-m1$pathImage$imageNameResult
解决方案:

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

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

第二种方法:

BufferedImage img=新的BufferedImage(宽度、高度、BufferedImage.TYPE_BYTE_GRAY);
WritableRaster raster=img.getRaster();
WritableRaster rasterJPEG=image.getRaster();
对于(inth=0;h溶液:

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

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

第二种方法:

BufferedImage img=新的BufferedImage(宽度、高度、BufferedImage.TYPE_BYTE_GRAY);
WritableRaster raster=img.getRaster();
WritableRaster rasterJPEG=image.getRaster();

对于(inth=0;hIf我理解正确,您只想将一些三通道(“颜色”)图像转换为单通道(“灰度”)图像?OpenCV中有函数,正确的Java API调用可能是
Imgproc.cvtColor(源、目标、Imgproc.color\u RGB2GRAY)
。你能用opencv Mat result8u,gray;result.convertTo(result8u,CV_8U);CVTCLOR(result8u,gray,COLOR_BGR2GRAY)试试吗?如果我理解正确,你只想将一些三通道(“彩色”)图像转换成一个通道(“灰度”)图像?OpenCV中有函数,正确的Java API调用可能是
Imgproc.cvtColor(源、目标、Imgproc.COLOR\u RGB2GRAY)
。您可以使用OpenCV Mat result8u,gray;result.convertTo(result8u,CV\u 8U);cvtColor(result8u,gray,COLOR\BGR2GRAY)尝试一下吗;
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);
}
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;