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.
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
: 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.
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.
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
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. –
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