使用透明层opencv读取和显示PNG时出现问题

时间:2017-11-04 18:06:41

标签: c++ image opencv

我正在做一个简单的阅读并显示PNG图像。我正在阅读背景为透明的png图像。我正在以灰度转换图像然后显示它。但转换后的图像看起来像这样:

原始图片

enter image description here

灰度图片

enter image description here

这是代码。我做错了什么?:

Mat image = imread("3X3_a11.png",IMREAD_GRAYSCALE);
Mat output(image.size(),image.type());
//    connectedComponents(image, output);
imshow("Output", image);
waitKey(0);
destroyAllWindows();

1 个答案:

答案 0 :(得分:2)

您的RGBA图像格式不正确,或者至少非常奇怪。加载时我看到警告:

libpng warning: iCCP: known incorrect sRGB profile

然而,您可以通过以下简单处理获得cv::connectedComponents的二进制版本需求:

#include <opencv2\opencv.hpp>

int main()
{
    cv::Mat4b img4b = cv::imread("path_to_image", cv::IMREAD_UNCHANGED);

    // Convert to grayscale getting rid of alpha channel
    cv::Mat1b img(img4b.rows, img4b.cols, uchar(0));
    for (int r = 0; r < img4b.rows; ++r) {
        for (int c = 0; c < img4b.cols; ++c) {
            if (img4b(r, c) == cv::Vec4b(255,255,255,255)) {
                img(r, c) = uchar(255);
            }
            if (img4b(r, c)[3] == 0) {
                img(r, c) = uchar(255);
            }
        }
    }

    cv::imshow("img", img);
    cv::waitKey();
}

结果:

enter image description here