2017-04-11 27 views
0

我試圖得到極小圖像與Magick ++ API版本7:統計與Magick ++的ImageMagick 7.0.5-4 Q16 x86_64的問題

img.type(Magick::GrayscaleType); 

auto stats = img.statistics(); 

std::cout << argv[0] << ":" << stats.channel(Magick::PixelChannel::GrayPixelChannel).minima() << std::endl; 

img.write("test" + Glib::ustring(argv[0]) + ".bmp"); 

爲多個圖像我得到同樣的minima值和錯誤值> 1.0。
在書面圖像上運行identify -verbose可以給我正確的價值。

我該如何解決這個問題?

EDIT 1

如果我

img.read("test" + Glib::ustring(argv[0]) + ".bmp"); 
stats = img.statistics(); 
std::cout << argv[0] << ":" << stats.channel(Magick::PixelChannel::GrayPixelChannel).minima() << std::endl; 

我得到最小值的正確值(和它不在範圍0 - 1.0在ImageMagick的7)。這裏

IMG是

img.composite(mask, 0, 0, Magick::OverCompositeOp); 

的結果,其中面具是

Magick::Image newmask(Magick::Geometry(width,height),Magick::Color("white")); 
    newmask.strokeColor("black"); 
    newmask.fillColor("black"); 
    newmask.draw(Magick::DrawableCircle(xc,yc, xc,yc+rc-10)); 
    newmask.transparent(Magick::Color("black")); 
    newmask.depth(8); 
    mask = newmask; 

回答

0

記住,你與量子值的工作 - 這系統之間的不同安裝。

選其一value/QuantumRangevalue*QuantumScale計算0 & 1.0之間的顯示值。

stats.channel(Magick::PixelChannel::GrayPixelChannel).minima()/QuantumRange 

例如...

// sample_program.cpp 
#include <iostream> 
#include <Magick++.h> 

using namespace std; 
using namespace Magick; 

int main(int argc, const char * argv[]) { 
    InitializeMagick(argv[0]); 
    Image img("rose:"); 
    img.type(GrayscaleType); 
    auto stats = img.statistics(); 
    cout << stats.channel(PixelChannel::GrayPixelChannel).minima()/QuantumRange << endl; 
    return 0; 
} 

編譯&執行...

$ ./sample_program 
=> 0.14478 

與CLI應用

$ convert rose: -type GrayScale -format '%[fx:minima]\n' info: 
=> 0.144778 

輕微四捨五入比較,但這是教人口會d與std:cout

+0

爲什麼不同:'convert rose:-colorspace Gray bmp: - |標識-verbose - | grep min' 分鐘:37(0.145098) – flc

+0

由於數據總體不同。每次在內存中操作圖像或編碼時,統計值都會改變。在你的評論的例子中,你生成一個BMP 8位sRGB圖像,並觀察到一些精度損失。 – emcconville