Как изменить битовую глубину изображения? - PullRequest
1 голос
/ 13 июня 2019

Я использую Mindtct (программное обеспечение NBIS). Когда я запускаю программу, я получаю следующую ошибку:

ОШИБКА: read_and_decode_grayscale_image: D: \ Users \ Malik \ Desktop \ cd642acd \ cd642acd_1 \ I1_S1.png: глубина изображения: 24! = 8

Mindtct - это инструмент для извлечения мелочей отпечатков пальцев: он принимает только изображения в градациях серого с DPI, равным 8 битам, но я использую датчик отпечатков пальцев, который, очевидно, генерирует изображения с DPI, равным 24 битам.

Мой вопрос: Как я могу изменить глубину изображения (уменьшить ее с 24 бит до 8 бит) в JAVA (OpenCV) или C ++ или даже другом языке?

./mindtct.exe -m1 $pathImage $imageNameResult

1 Ответ

0 голосов
/ 13 июня 2019

Решение:

Первый метод: (Эта версия требует 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...