【问题标题】:How to write image in grayscale format in Magick++如何在 Magick++ 中以灰度格式写入图像
【发布时间】:2014-06-16 19:30:12
【问题描述】:

如何以灰度格式保存Magick::Image?我正在使用ImageMagick 解码图像并将结果写入OpenCV 矩阵。我现在正在做的是读取彩色图像,然后通过OpenCV将其转换为灰度:

Magick::Image image("test.png");
cv::Mat mat(image.rows(), image.columns(), CV_8UC3);
image.write(0, 0, image.columns(), image.rows(), "BGR", Magick::CharPixel, mat.data);
cv::cvtColor(mat, mat, CV_BGR2GRAY);

我想将图像写入cv::Mat,已经是灰度图像,没有中间彩色图像。这应该很简单,但无法从文档中找到它,希望能提供任何帮助。

我也想知道如何检测图像是否包含 Alpha 通道?

【问题讨论】:

    标签: c++ image-processing imagemagick magick++


    【解决方案1】:

    要将图像设置为灰度,只需在将图像 blob 写入 cv 之前调用 Magick::Image.type( Magick::ImageType )

    Magick::Image image("test.png");
    image.type( Magick::GrayscaleType );
    image.write(0, 0, image.columns(), image.rows(), "BGR", Magick::CharPixel, mat.data);
    

    要检测图像是否透明,只需检查 Magick::Image.matte() 是否返回 true。

    Magick::Image image("test.png");
    std::cout << "transparent = " << ( image.matte() ? "true" : "false") << std::endl;
    

    【讨论】:

    • 您仍在写入 BGR 格式的 3 通道矩阵。我的目标是获得一个单通道灰度矩阵。有可能吗?
    • 你应该使用 cv::Mat mat(image.rows(), image.columns(), CV_8UC1);并指定“R”而不是“BGR”。
    • @dlemstra 是正确的。切换到 GrayscaleType 后只需删除“BG”即可。您可以通过将图像分离为 CMYK 并只编写“K”通道来进行更详细的操作,但这有点过头了。
    猜你喜欢
    • 2016-03-12
    • 2017-02-04
    • 2013-12-13
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多