Что я хочу сделать
- Файл: TIFF, 2 страницы, оттенки серого, 16 бит.
- OpenCV: 2x Mat, оттенки серого, 16 бит (CV_16UC1)
- Qt: 2x QImage, оттенки серого, 8 бит (Format_Greyscale8)
Я хочу прочитать 16-битный Tiff, а затем преобразовать его, чтобы показать его как 8-битный.
Чтение
void ImgProc::Load_Image_2xTiff_16bit_G(Mat *Mat_A_in, Mat *Mat_B_in, string file_name)
{
vector<Mat> vec_Mat;
vec_Mat.reserve(2);
imreadmulti(file_name, vec_Mat);
*Mat_A_in = vec_Mat[0];
*Mat_B_in = vec_Mat[1];
}
Преобразование
void ImgProc::Convert_Mat16_2_QIm8(QImage *QIm_Out, Mat *Mat_In, double scale_factor)
{
unsigned int rows = Mat_In->rows;
unsigned int cols = Mat_In->cols;
*QIm_Out = QImage(cols, rows, QImage::Format_Grayscale8);
unsigned char* line_QIm;
if (!Mat_In->data)
return;
for(unsigned int y = 0; y < rows; y++)
{
line_QIm = QIm_Out->scanLine(y);
for(unsigned int x = 0; x < cols; x++)
{
line_QIm[x] = (unsigned char)(Mat_In->at<ushort>(y, x) * scale_factor);
}
}
}
Проблема
Когда я использую Mat_In->at<ushort>(y, x)
(читай 16 бит), он вылетает с abort() has been called
. То же самое произойдет, если я вместо этого использую <short>
.
Когда я использую Mat_In->at<uchar>(y, x)
(читай 8 бит), это работает, но обрезает информацию без масштабирования. Это проявляется как «черные дыры» в более ярких областях изображения, вероятно, эффект переполнения.
Я думаю, я должен упомянуть, что камера, которая делала изображения, использует только 14-битную глубину.
Mat_In
? | Почему бы не использоватьcv::Mat::convertTo
(а затем просто работать с весь необработанный буфер, а не перебирать его пиксель за пикселем). - person Dan Mašek   schedule 05.09.2018Mat_In.type();
возвращает0
. Я пытался использоватьcv::Mat::convertTo
, но потерпел неудачу, поэтому я попробовал этот способ. Мне также нравится, что я точно знаю, что там происходит, и могу манипулировать в любое время, когда захочу. - person Kemendil   schedule 05.09.20180
соответствуетCV_8U
, то есть изображение уже 8-битное. Это объяснило бы сбой (я ожидаю, что он пройдёт половину строк). Можете ли вы предоставить образец изображения, которое вызывает эту проблему? - person Dan Mašek   schedule 05.09.2018cv::IMREAD_ANYDEPTH|cv::IMREAD_ANYCOLOR
в качестве флагов кimreadmulti
, так что, Дэн Масек, ваша мысль была правильной, спасибо. - person Kemendil   schedule 06.09.2018imreadmulti
и думал, что это какая-то пользовательская функция. - person Micka   schedule 06.09.2018