2015-05-01 17 views
9

here, RGB ve Parula arasında bir bijeksiyon yoktur. Parula'daki dosyaların görüntü işlemenin nasıl iyi yapılacağını düşünüyorum. Bu sorun, Parula renkleri ile genelleştirilmiş bir soruna genişleterek, EKG görüntülerinden siyah rengi kaldırmakla ilgili olarak bu thread numaralı telefondan geliştirilmiştir.Çözünürlüğü kaybetmeden Matlab'da Parula görüntüsünü görüntülemek için

veri:

enter image description here

İkinci görüntüyü okumak için çözümde bu kodu kullanmak için bu iş parçacığı noktada değil

[X,Y,Z] = peaks(25); 
imgParula = surf(X,Y,Z); 
view(2); 
axis off; 

tarafından oluşturulmaktadır.

Kodu: map[] ve alpha tamamen beyaz bir resimdir

[imgParula, map, alpha] = imread('http://i.stack.imgur.com/tVMO2.png'); 

. Gerçek renk haritası Parula olmasına rağmen imshow(imgParula) yaparsanız son girişim bir çok görmek ve Matlab RGB görüntüleri okur çünkü çözünürlük kaybetti

enter image description here

verir. Bu resmi yeniden boyutlandırma çözünürlüğü iyileştirmez.

Görüntüyü Matlab'da karşılık gelen renk eşlemine nasıl okuyabilirsiniz? Okumada renk eşlemesini belirtmek için herhangi bir parametre bulamadım.

+0

O var bana tamamen açık değildir: Eğer ('imshow' ve Parula renk haritası ile birlikte) ilk görüntüyü oluşturmak için kullanılmış olan diziyi almak istiyor musunuz? – Ratbert

+0

Evet. İlk Parula görüntüsünü oluşturmak için kullanılmış olan verileri almak istiyorum.Dosyayı tekrar Matlab'a okuyarak ve sonra yeniden çizerek ilk görüntüyü oluşturabiliyorum. –

+1

Tamam. Eğer caxis 'in ne olduğunu bilmiyorsanız (_i.e._ colormap's range) bir belirsizlik vardır. Örneğin, mavi bu ayara bağlı olarak herhangi bir değer olabilir ... Bir çözüm, örneğin ilk veri aralığı olmayabilir, örneğin 0 ile 1 arasında bir dizi verirdi. – Ratbert

cevap

9

Sorun

RGB üçüz parula renk haritası içinde endeksli renklerden bir one-to-one mapping yoktur. Ancak, parula endeksli bir rengin RGB'ye geri döndürülmesi için bu işlemi tersine çevirmek için böyle bire bir eşleme yoktur (aslında bunu yapmak için sonsuz sayıda yol vardır). Böylece, iki boşluk arasında bire bir yazışma veya bijection yoktur. Her bir parula endeksi için R, G ve B değerlerini gösteren aşağıdaki çizim, bunu daha net hale getirir.

Parula to RGB plot

Bu

en endeksli renkler için geçerlidir. Bu probleme herhangi bir çözüm benzersiz değildir.


A Dahili bu biraz etrafında oynadıktan sonra, ben zaten yeterli olabilir yerleşik bir işlevi var olduğunu fark

Çözüm: rgb2ind endeksli RGB görüntü verilerini dönüştürür görüntü verisi Bu işlev, ters renk eşlem dönüşümü gerçekleştirmek için dither (hangi sırayla ditherc mex işlevini çağırır) kullanır.

img0 = peaks(32);      % Generate sample data 
img0 = img0-min(img0(:)); 
img0 = floor(255*img0./max(img0(:))); % Convert to 0-255 
fname = [tempname '.jpg'];   % Save file in temp directory 
map = parula(256);     % Parula colormap 
imwrite(img0,map,fname,'Quality',50); % Write data to compressed JPEG 
img1 = imread(fname);     % Read RGB JPEG file data 

img2 = rgb2ind(img1,map,'nodither'); % Convert RGB data to parula colormap 

figure; 
image(img0);       % Original indexed data 
colormap(map); 
axis image; 

figure; 
image(img1);       % RGB JPEG file data 
axis image; 

figure; 
image(img2);       % rgb2ind indexed image data 
colormap(map); 
axis image; 

Bu aşağıdaki ilk üçe benzer görüntüler üretmek olmalıdır:

Burada orijinal parula endeks verileri renkleri gürültü ekleyip tahrif için JPEG sıkıştırmasını kullanan bir gösteri bu.


Alternatif Çözüm

Example original data and converted images

: Renk Farkı

bu görevi başarmak için başka bir yol, her renk haritası endeksi karşılık RGB değerleri ile RGB görüntüdeki renklerin arasındaki farkı karşılaştırarak olduğunu . Bunu yapmanın standart yolu, CIE L*a*b* renk boşluğunda calculating ΔE'dır. Bu formun bir formunu rgb2map adı verilen ve downloaded from my GitHub olabilir. Bu kod, 1976 CIE L * a * b * renk uzayı RGB dönüştürmek için Görüntü İşleme Toolbox içinde makecform ve applycform dayanır.

aşağıdaki kod, yukarıda sağda gibi bir görüntü elde edilir: bir giriş, görüntüdeki her piksel için RGB

img3 = rgb2map(img1,map); 

figure; 
image(img3);       % rgb2map indexed image data 
colormap(map); 
axis image; 

, rgb2map o ve giriş renk haritası her RGB triplet arasındaki renk farkı hesaplar CIE 1976 standardını kullanarak. min işlevi en az Δ E dizinini bulmak için kullanılır (birden fazla en değeri varsa, ilk göstergesi döndürülür). Daha sofistike araçlar birden Ô E minimum durumunda "en iyi" rengini seçmek için kullanılabilir, ancak bunlar daha maliyetli olacaktır.


Sonuçlar

Son bir örnek olarak, aşağıdaki şekilde iki yöntem karşılaştırma an image of the namesake Parula bird kullanılır. Bu görüntü için iki sonuç oldukça farklı. Daha karmaşık CIE 1994 renk farkı standardını kullanmak için rgb2map öğesini elle ayarladıysanız, başka bir oluşturma daha elde edersiniz. Ancak, orijinal parula colormap ile daha yakından eşleşen resimler için (yukarıdaki gibi) her ikisi de daha fazla benzer sonuç döndürmelidir. Önemli olan, rgb2ind mex arayan fonksiyonlardan yararları ve (CIE 1994 standardı kullanılırsa, bu yaklaşık 700 kat daha hızlı olduğunu) benim kod birkaç optimizasyonlar rağmen rgb2map daha neredeyse 100 kat daha hızlıdır.

RGB image of bird converted using two methods

Son olarak, Matlab renk haritaları hakkında daha fazla bilgi edinmek isteyenler, yeni parula renk haritası Steve Eddins tarafından bu four-part MathWorks blog post okumalısınız.

Güncelleme 2015/06/20: Farklı renk uzayı dönüşümleri kullanmaya güncellenen yukarıda açıklananrgb2map kodu, bunu geliştirir ikisinin neredeyse bir faktörle hız bu.

+0

'rgb2map', tüm renklerde rgb2ind'den daha iyi gözüküyor. “rgb2map” sarı renkle yanıyor gibi görünüyor. ** Neden bu yanma "rgb2map" içinde meydana geliyor? Bundan kaçınmanın herhangi bir yolu var mı? ** Başka bir umut, örneklerin bazılarında dikey ve yatay çizgilerin ızgarasını tutabilseydiniz. Farklı işlevlerin farklı ortamlardaki çizgileri nasıl etkilediğini görmek isterim. Bu çizgiler özellikle belirli bir nedenden ötürü meydan okumaya koyulur. –

+1

@Masi: Sanırım en yakın renk eşlemesini bulmak için basit bir 'min' işlevinin kullanılmasından kaynaklanıyor. Aşırı uçlarda, yani siyah, beyaz ve tam doygun renklere yakın yerlerde, muhtemelen ilk kullanımın olacağı çoklu minima olacak. Bu, renk haritasındaki aşırı değerlerden biri olarak gösterilen birçok pikselle sonuçlanır. Bunun etrafındaki potansiyel yollar: 1) farklı bir rengin her zaman seçili olması için renk haritasının yeniden düzenlenmesi, 2) çoklu minima mevcut olduğunda rastgele seçim (veya başka bir şema), 3) seçimi değiştirmek için belirli kanalları veya bunların kombinasyonlarını saptamak için ağırlık kullanımı. – horchler

+1

'Parula'nın colormap'i siyah beyaz içermiyor. Resimleriniz ekran yakaları gibi görünüyor ve indeksli renkler kullanılmasına rağmen siyah çizgiler var çünkü verileri görüntü olarak değil, "sörf" ile 3 boyutlu bir nesne olarak görüntülüyorsunuz (siyah, verilerin ne olursa olsun varsayılan kenar rengidir) . Bunu işlemek için tamamen farklı bir işlem veya özel durumlar gerekli olacaktır. Önceden dosyaları önceden işleme ve kaydetme ile problemden kaçınmak belki daha iyi olacaktır. – horchler

İlgili konular