2014-04-30 19 views
1

如何以灰度格式保存Magick::Image?我正在使用ImageMagick解碼圖像並將結果寫入OpenCV矩陣。我現在正在做的是閱讀的彩色圖像,然後將其轉換通過OpenCV爲灰度:如何在Magick ++中以灰度格式書寫圖像

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已經,沒有intermidiate彩色圖像。這應該非常簡單,但無法從文檔中找到它,並希望得到任何幫助。

另外我想知道如何檢測圖像是否包含alpha通道?

回答

4

要將圖像設置爲灰度,請在將圖像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; 
+0

您仍在寫入BGR格式的3通道矩陣。我的目標是獲得單通道灰度矩陣。可能嗎? – lizarisk

+0

你應該使用cv :: Mat mat(image.rows(),image.columns(),CV_8UC1);並指定「R」而不是「BGR」。 – dlemstra

+0

@dlemstra是正確的。切換到GrayscaleType後,放下「BG」。您可以通過將圖像分離到CMYK並只寫「K」通道來進行更詳細的描述,但這是過度的。 – emcconville