fixed bug: opencv read tif file convert Palette color image as grayscale image
authorHarvey <harvey@originlab.com.cn>
Wed, 27 Oct 2021 05:52:54 +0000 (13:52 +0800)
committerHarvey <harvey@originlab.com.cn>
Wed, 27 Oct 2021 06:10:11 +0000 (14:10 +0800)
modules/imgcodecs/src/grfmt_tiff.cpp
modules/imgcodecs/test/test_tiff.cpp

index a46ed3a..5e7523b 100644 (file)
@@ -303,7 +303,12 @@ bool TiffDecoder::readHeader()
                     result = true;
                     break;
                 case 8:
-                    m_type = CV_MAKETYPE(CV_8U, !isGrayScale ? wanted_channels : 1);
+                    //Palette color, the value of the component is used as an index into the red,
+                    //green and blue curves in the ColorMap field to retrieve an RGB triplet that defines the color.
+                    if(photometric == PHOTOMETRIC_PALETTE)
+                        m_type = CV_MAKETYPE(CV_8U, 3);
+                    else
+                        m_type = CV_MAKETYPE(CV_8U, !isGrayScale ? wanted_channels : 1);
                     result = true;
                     break;
                 case 16:
index dec3801..a2f9655 100644 (file)
@@ -219,6 +219,16 @@ TEST(Imgcodecs_Tiff, readWrite_32FC3_RAW)
     EXPECT_EQ(0, remove(filenameOutput.c_str()));
 }
 
+TEST(Imgcodecs_Tiff, read_palette_color_image)
+{
+    const string root = cvtest::TS::ptr()->get_data_path();
+    const string filenameInput = root + "readwrite/test_palette_color_image.tif";
+
+    const Mat img = cv::imread(filenameInput, IMREAD_UNCHANGED);
+    ASSERT_FALSE(img.empty());
+    ASSERT_EQ(CV_8UC3, img.type());
+}
+
 
 //==================================================================================================