2015-08-12 20 views
15

Yapmaya çalıştığım şey, bir pikselin mavi olup olmadığını sınamaktır.Piksel rengi için net aralık nasıl tanımlanır

Örneğin: Mavi renk RGB olarak rgb olarak tanımlanmıştır (0,0,255). Tipik renk derinlikleri 8 bit (256 renk), 16 bit (yaklaşık 65 bin), 24 bit (yaklaşık 16 milyon) ve 32 bit (4 milyardan fazla farklı renk). Yani açıkça 1 gölgeden fazla mavi var.

Mavi renk aralığını nasıl tanımlarım ve mavi olup olmadığını her piksel için nasıl test edebilirim? Ve farklı derinliklerde akılda tutulması gereken neye ihtiyacım var?

Kodum şimdiye kadar geçerli:

BufferedImage image = ImageIO.read(file); 

// Getting pixel color by position x and y 
for (int i = 0; i < image.getWidth(); i++) { 
    for (int j = 0; j < image.getHeight(); j++) { 
     int clr = image.getRGB(i, j); 

Not 1:

burada is

http://www.workwithcolor.com/cyan-blue-color-hue-range-01.htm

sorun, renk adımlar arasında nedir?

Bir örnek harika olurdu.

Not 2: Biz kırmızı tanımını görebilirsiniz 13. sayfada

http://cstwiki.wtb.tue.nl/images/06-opencv.pdf

: Sadece ben ilgilendiğim konu hakkında bir sunum bulundu

. Ama diğer renkleri nasıl tanımlayabilirsiniz?

+1

İlk başta RGB Renkleri için aralık ayarlayabileceğinizi düşündüm ama bu işe yaramayacak. Renk tablosunda görebileceğiniz gibi: http://2.bp.blogspot.com/_DmvFk3aIxDI/S9Kbb5BOjEI/AAAAAAAAADk/MVrj60t6ec8/s1600/cc.png mavi # 000066'dan başlar ve # 66FFFF hala mavidir. Ama aradaki her şey mavi değil. –

+0

bunu buldum: http://stackoverflow.com/questions/30361786/how-to-tell-visible-color-from-rgb-values ​​ yardımcı olmalıdır. –

+0

Hayır, değil! HUE'de mavi değerini seçerseniz, Doygunluk ve Değer/Parlaklık parametrelerini değiştirebilir, böylece artık mavi görmeyeceksiniz. Buradan deneyin: http://colorizer.org/ –

cevap

8

Benim düşünceme göre en kolay yol renk formatını HSV/HSB'ye dönüştürmek ve sonra Ton için mavi aralığını seçmektir. Tam aralık bir problem olabilir, ancak çoğunlukla 165 (aşağıda yeşil) ile 240 arasında (yukarıda mor/mor) kullanıyorum. Doygunluk ve Değer/Parlaklık sadece tonları kontrol eder, ancak 0'a yakın Doygunluğun biraz mavimsi gölgeyle oldukça gri olacağını ve 0'a yakın değerin neredeyse siyah olacağını unutmayın. Bu nedenle, Doygunluğu> 10 ve Değer> 15 olarak da kontrol edebilirsiniz, ancak elbette kendi değerlerinizi ihtiyaçlarınızı karşılayacak şekilde seçebilirsiniz. (Değil test)

örnek kod:

boolean isBlue(int rgb){ 
    Color color = new Color(rgb); 
    float[] hsb = Color.RGBtoHSB(color.getRed(), color.getGreen(), color.getBlue(), null); 
    // now [0] is hue, [1] saturation and [2] value/brightness 
    // all values are between 0 and 1 so you must divide hue by 360 and others by 100 
    if(hsb[0] > 165/360 && hsb[0] < 240/360 && hsb[1] > 0.1 && hsb[2] > 0.15) 
     return true; 
    return false; 
} 

Wiki about HSV

RGBtoHSB javadoc

Color picker to check colors in different systems

+0

Evet, bu muhtemelen sıradan bir yaklaşımdır. Yine de “kendi değerlerini kendi ihtiyaçlarına göre seçmek” için bir yol arıyordum. –

+1

Eh, burada zor soru tam olarak ne ihtiyacınız var. Koyu ve 'bulutlu' tonlara uymak istiyorsanız, hem doygunluğun hem de değerin 50'den (veya 0,5'inde) olması gerekir. Bir önceki yorumda 'açık gökyüzü' aradığınızı önerdiğini, muhtemelen deniz kuvvetleri ile düşük doymuş camgöbeği arasında bir yer olduğunu öne sürdünüz, bu yüzden> 25 (aşağıda 'çok bulutlu') doygunluk ve> 50 değeri (daha doğrusu gece gökyüzü tonları). Cevap olarak, karanlıktan açık tonlara ve tüfekten indigoya kadar oldukça evrensel mavi bir tanım sağladım. – xnor

+1

@ JürgenK. Mavi kendi tanımınız varsa, lütfen sorunuza ekleyin. İnsanlardan sizin için bir renk tanımlamasını isterseniz, kendi yaklaşık tanımını elde edersiniz. Ve bazı durumlarda, insanlar [beyaz olarak mavi bir elbise] görüyorlar (https://en.wikipedia.org/wiki/The_dress). –

0

Teknik olarak aşağıda mavi tonları için uygulama olmalıdır.

boolean isBlueShade(int r, int g, int b) 
{ 
    return (r == g) && (r != b); 
} 

CYAN'ın da mavi olduğunu söyleyebiliriz. Ama teknik olarak bu mavi değil. Uygulamanız, mavi olmak için bazı ilgili renkler gerektiriyorsa, o zaman bu aralığı denetlemek için yukarıdaki yöntem uygulaması.

Sadece beklenmedik bir çözüm olsa bile, açıkça düşündüğüm şeyleri iletmek için yukarıdaki yöntemi düzenlemekteyim.

+0

Bu, sorunun cevabı değildir. soru, mavi renkli –

+1

için aralık kontrolünün nasıl tanımlanacağıdır. Bu tanımlamaya dayanan beyaz ve siyah veya gri tonlamalı da mavidir. RGB sezgisel model değildir, renkleri ayırt etmek için kolayca kullanılabilir. – xnor

4

RGB renk alanında bu yapmak kolay değildir. Birincisi, renklerin görüntülenme biçimi, cihaza bağımlıdır, yani görüntülemeyi seçtiğiniz RGB değeri, farklı ekranlarda oldukça farklı görünebilir. Ancak bu, bir şekilde kontrol edilebildiği zaman bile, İngilizce'de belirli isimlere atanan renkler, RGB renk küpünde aynı boyutta yer almaz, ne boyut ne de şekil bakımından. Bu nedenle, renklerin insan algı hakkında tahmin etmeye çalışan birkaç renk modeli vardır.

Bunun için bir yarışmacı, CIELab renk alanıdır. "Lab", bu modelde renklerin nasıl temsil edildiğini ifade eder: rengin açıklığı L, kırmızı/macenta ve yeşil eksen üzerindeki rengin konumu (a) ve sarı ve mavi eksen üzerindeki konumu (b). Ne yazık ki, RGB ve CMYK değerleri ile L a b * arasında dönüştürme için basit formül yoktur, çünkü RGB ve CMYK renk modelleri aygıta bağımlıdır. RGB veya CMYK değerleri önce sRGB veya Adobe RGB gibi belirli bir mutlak renk alanına dönüştürülmelidir. Bu ayar, cihaza bağımlı olacaktır, ancak elde edilen veriler, cihazdan bağımsız olacaktır.

İlgili konular