2013-01-26 14 views
22

imshow işlevini kullanarak CV_32F tipi bir görüntü göstermeye çalıştım ancak BEYAZ görüntü gösterdi. Documentation yılında onun kayan nokta görüntüleri 0-255 eşleştirilir ve görüntüleneceğini verilen ama sadece beyaz image.IMat nesnesinin türünü CV_32F'den CV_8U'ye değiştirin.

Mat A = Mat :: olanlar (300.300 kullanarak CV_8U dönüştürmek için çalıştı gösterdi CV_32FC1) x 1000;

yapılacak bir işleme - ...... bir

piksel için float değerleri tahsis

Mat B;

A.convertTo (B, CV_8U)

ben 'B' ı siyah & beyaz görüntü elde imshow

, gri ait hiçbir tonları vardır. Float değerli pikseller düzgün bir şekilde 0-255 olarak eşlenmiş mi? Yanlış bir şey yapıyorum?

A'daki birkaç değer, başlatıldıkça 1000'dir ve dinlenme, işleme sırasında atanan bazı kayan nokta sayılarıdır.

cevap

43

OpenCV'de, görüntüde kayan nokta türü varsa, bu değer yalnızca 0'dan 1.0'a kadar olan değerlerde imshow kullanılarak görüntülenebilir, bu değer beyaz piksel olarak gösterilir. ve 0,0'dan küçükse, siyah piksel olarak gösterilir. Bir kayan nokta görüntüsünü görselleştirmek için, değerlerini 0.0 - 1.0 aralığına ölçeklendirin.

Dönüştürme kısmı hakkında .... Varsayılan argümanlarla kullanıldığında, cv::Mat::convertTo işlevi yalnızca belirtilen türden bir matris oluşturur ve sonra değerleri kaynak matristen kopyalar ve ardından bunları mümkün olan en yakın değere yuvarlar. hedef veri tipi. Değer aralık dışındaysa, minimum veya maksimum değerlere kenetlenir. imshow belgelerinde

, bu yazılır: Resim 32-bitlik kayan nokta ise

, piksel değerleri çarpılır 255 tarafından kendisine, değer aralığı [0, 1] [0,255] ile eşleştirilmiştir.

Bu aralığında yalnızca değerleri 0.0 ila 1.0 bir değer 1.0'dan daha büyük ise 0 ile 255 eşlenir ve çarpılarak o olacak daha tarafından 255, bu daha büyük 255'e olacak anlamına gelir

hedef tür CV_8U ve mümkün olan en yüksek değer 255 gibi CV_8U aralığında kenetlenmiş ve sonunda da bir örnekte 255

olur, 1000 olan tüm değerleri, hedef matris içinde 255 olacaktır. Tüm kayan nokta değerleri floor ed olacaktır. Otomatik haritalama yapılmaz. dönüşüm yapılır önce değerleri ölçekli böylece

uygun, CV_8U kullanımı 3 ve fonksiyon cv::Mat::convertTo 4. parametreleri aralığına değerlerini eşleştirmek için.

matris A minimum ve maksimum değerleri Min ve Max, Min!=Max olduğunu varsayalım.

if (Min!=Max){ 
    A -= Min; 
    A.convertTo(B,CV_8U,255.0/(Max-Min)); 
} 

Ayrıca böyle doğrudan yapabilirsiniz:

if (Min!=Max) 
    A.convertTo(B,CV_8U,255.0/(Max-Min),-255.0*Min/(Max-Min)); 

(hesap zhangxaochen yorumuna dikkate alınarak düzenlediğini

düzgün aşağıdakileri yapabilirsiniz, 0 ile 255 arasında değerler ölçeklemek için

+0

Teşekkürler sgar91, Azami değeri 2.3221 ve maksimum değerin 1000 olduğunu öğrendim. Bu aralığı 0-255'e nasıl eşlerim? Ben convertTo 3. ve 4. parametre için ne kullanmalıyım? –

+1

@KarthikMurugan ... güncellenmiş cevabımı kontrol et. – sgarizvi

+5

'beta 'alanı -255.0/Min' yerine -255.0 * Min/(Maks-Min) olmalıdır. – zhangxaochen