Görüntü İşleme Araç Kutusunun Açıklaması. Sürekli sinyallerden ve dönüşümlerden ayrık sinyallere geçiş

  • 05.05.2019

Dijital görüntü işlemede, sürekli dinamik parlaklık değerleri aralığı, bir dizi ayrık seviyeye bölünür. Bu işleme kuantizasyon denir. Kuantizer, sürekli bir değişkeni, sonlu bir değerler kümesi alan ayrı bir değişkene dönüştürür. Bu değerlere nicemleme seviyeleri denir. V Genel dava dönüşüm bir adım fonksiyonu ile ifade edilir (Şekil 1.5). Görüntü örneğinin parlaklığı aralığa (yani ne zaman) aitse, orijinal örnek niceleme eşiklerinin olduğu niceleme düzeyi ile değiştirilir. Dinamik parlaklık değerleri aralığının sınırlı ve eşit olduğu varsayılmaktadır.

Şekil 1.5 Nicelemeyi Tanımlayan Fonksiyon

Bir niceleyici oluşturma görevi, eşiklerin ve seviyelerin değerlerini belirlemektir. en basit yol bu sorunun çözümü bölmekten ibarettir dinamik aralık eşit aralıklarla. Ancak, bu en iyi çözüm değildir. Görüntü örneklerinin çoğunun parlaklık değerleri, örneğin "karanlık" alanda gruplandırılmışsa ve düzey sayısı sınırlıysa, eşit olmayan şekilde niceleme yapılması önerilir. "Karanlık" alanda, "aydınlık" alanda daha sık ve daha az sıklıkla niceleme yapmalısınız. Bu, niceleme hatasını azaltacaktır.

Böylece, bir niceleyici oluşturma problemi, optimal değerleri bulma ve bazı optimizasyon kriterlerini karşılama problemi olarak formüle edilebilir. Genellikle, sabit sayıda seviye için, niceleyici minimum ortalama kare hatası kriterine göre optimize edilir.

(1.12)

parlaklık olduğunu varsayarsak rastgele değer bilinen bir olasılık yoğunluğu ile

Ortalama kare niceleme hatası (1.12)

. (1.13)

(1.13)'ün değişkenlere göre türevini alarak ve türevleri sıfıra eşitleyerek, doğrusal olmayan denklemler elde ederiz.

.

Aşırı eşiklerin ve dinamik parlaklık aralığı tarafından belirlendiğine dikkat edilmelidir. Denklemler (1.14) kolayca forma indirgenebilir

.

(1.15)'ten, eşiklerin iki bitişik seviye ve arasında ortada yer alması gerektiği sonucu çıkar. Bu denklemlerin çözümü yinelemeli bir şekilde bulunabilir. Optimal niceleyiciyi karşılayan kriter (1.12) Lloyd-Max niceleyici olarak adlandırılır ve böyle bir niceleyici için ortalama karekök hatası şöyledir:

(1.16)

Düzgün bir parlaklık dağılımı ile doğrusal olmayan denklemler (1.15) şu şekilde temsil edilebilir:

,

ve kök ortalama kare hatadır.

sistemlerde dijital işleme görüntüler, seviyelerin ve niceleme eşiklerinin sayısını azaltma eğilimindedir, çünkü bilgisayardaki nicelenmiş örnekleri temsil eden ikili kod kelimesinin uzunluğu, sayılarına bağlıdır. Ancak göreceli olarak küçük sayı nicelenmiş görüntüdeki seviyeler yanlış konturlar olarak görünür. nedeniyle ortaya çıkarlar ani değişiklik nicelenmiş görüntünün parlaklığı (Şekil 1.6) ve özellikle değişiminin hassas alanlarında fark edilir.

Yanlış konturlar, bir görüntünün görsel kalitesini önemli ölçüde düşürür. insan görüşü özellikle dış hatlara duyarlıdır. Tek tip niceleme ile tipik görüntüler en az 64 seviye gerektirir. Şekil 1.7.a ve 1.7.b, sırasıyla 256 ve 14 nicemleme seviyelerinde "Portre" görüntüsünün tek tip nicelemenin sonuçlarını göstermektedir.

Şekil 1.6. Sahte konturların ortaya çıkma mekanizmasına

Şekil 1.7. Tekdüzen Niceleme Sonuçları

Şekil 1.8. Düzensiz Niceleme Sonucu

Şekil 1.9. "Portre" görüntüsünün histogramı

Şekil 2'deki görüntünün karanlık kısımlarında. 1.7.b yanlış konturlar görülebilir. Lloyd-Max kuantizörünün kullanımı, seviyelerini önemli ölçüde azaltabilir (kuantizasyon seviyelerinin sayısının da 14 olduğu Şekil 1.8'e bakın). İncirde. 1.9, 256 niceleme seviyesinde "Portre" görüntü parlaklığının bir histogramını gösterir ve eşikleri olarak işaretler. Şekilden, örneklerin parlaklık değerlerinin gruplandığı dinamik aralığın bölgelerinin daha sık nicelleştirildiği anlaşılmaktadır.

Standart bir ADC ile yapılamayan eşit olmayan nicelemeyi önlemek için doğrusal olmayan dönüşümler kullanılır (Şekil 1.10). Orijinal görüntünün örneği doğrusal olmayan bir dönüşüme tabi tutulur, böylece dönüştürülmüş örneklerin olasılık dağılım yoğunluğu tek tip olur, yani. Bölüm 2'de ayrıntılı olarak açıklanan eşitleme prosedürü gerçekleştirilir. Numuneler daha sonra eşit adımlarda nicelenir ve ters doğrusal olmayan bir dönüşüme tabi tutulur.

Şekil 1.10. Ön doğrusal olmayan dönüşüm ile niceleme

Yanlış konturları yok etmek için Roberts, düzgün nicemlemeden önce parlaklık örneklerine düzgün olasılık yoğunluğuna sahip gürültü eklemeyi önerdi. Eklenen gürültü, görüntünün bazı örneklerini bir seviye daha yüksek ve diğerlerini bir seviye daha düşük alır. Bu, sahte konturları yok eder. Eklenen gürültünün varyansı, görüntüde "kar" olarak algılanan bozulmalara yol açmayacak ve aynı zamanda yanlış konturları yok edecek kadar küçük olmalıdır. Genellikle, aralık boyunca eşit olarak dağıtılmış gürültü kullanılır. Ön gürültü ilavesiyle "Portre" görüntüsünün 14 ve 8 seviyelerinde tek tip nicelemenin sonuçları Şekil 1.11.a ve 1.11.b'de gösterilmektedir. 8 niceleme seviyesinde, eklenen gürültü çok fark edilir hale gelir, ancak yanlış konturlar neredeyse tamamen yok edilir.

Şekil 1.11. Ön Gürültü Toplamalı Tekdüzen Niceleme Sonuçları

Basım endüstrisinde başka bir niceleme yöntemi kullanılmaktadır. Bu, gri tonlamadan raster ikili (2 seviyeli) görüntüler oluşturma yöntemidir. Yazdırırken (örneğin gazeteler veya dergiler), görüntü beyaz ve siyah noktalardan oluşur. Bunu yapmak için, orijinal görüntünün tamamı uzamsal koordinatlarla aynı kare bloklara bölünür. Genellikle bir blok öğeler içerir. Boyutları bloğun boyutlarına eşit olan, bozucu sinyalin matrisinden karşılık gelen koordinatlara sahip bir sayı, bloğun her örneğine eklenir. Örneğin, rahatsız edici sinyalin matrisi olarak sayılar kullanılır:

.

Bu işlem tüm bloklar için tekrarlanır. Ortaya çıkan görüntü iki seviyeye kuantize edilir. İncirde. 1.12.а, rahatsız edici bir sinyal eklenmiş gri tonlamalı bir görüntü "Portre" gösterir. İncirde. 1.12.b, c, "Portre" görüntüsünün ilave bir rahatsız edici sinyalle (Fig.1.12.b) ve onsuz (Fig.1.12.c) ikili nicemleme sonuçlarını gösterir.

Şekil 1.12 Görüntüleri Rasterleştirme

İkili bit eşlem, normal bir ikili görüntüden çok daha iyi bir görsel deneyim sağlar. Rasterleştirme sırasında gri ölçeğin iletimi, geometrik boyutların değiştirilmesiyle sağlanır. Beyaz nokta siyah bir arka plan üzerinde gözlemlenir. Bir blokta “hafif” örnekler gruplanırsa, beyaz noktanın geometrik boyutları maksimumdur ve bloğun boyutuna eşittir. Parlaklığın azalmasıyla geometrik boyutları da azalır. İnsan gözü, gri tonlamalı bir görüntüyü izleme yanılsaması yaratarak yerel ortalamayı gerçekleştirir. Tarama prosedürü, özellikle aşağıdakilerle görüntüleri yazdırırken etkilidir. yüksek çözünürlük tek bir nokta gözle zar zor göründüğünde.

Renk derinliğinin belirlenmesi

Çoğu bilgisayar, piksel başına 8, 16 veya 24 bit kullanarak görüntüler. Bu, görüntülenen görüntünün renk derinliğini belirler.

Sistem kaç renk gösterirse göstersin, MATLAB görüntüleri depolayabilir ve işleyebilir. farklı sayılar piksel başına bit: uint8 RGB görüntüler için 224 renk, uint16 RGB görüntüler için 248 renk ve çift duyarlıklı RGB görüntüler için 2159 renk. Bu görüntüler en iyi 24 bit renk sisteminde görüntülenir, ancak görüntüleme kaynakları her zaman bu renk derinliğini sağlamayabilir. Çoğu durumda, 16 bitlik bir renk temsili sağlarlar.

  • Sistemin renk derinliğini belirleme açıklaması
  • Renk derinliği seçiminin açıklaması

Renk Derinliği Açıklama

Sistemin görüntüleyebileceği renk derinliğini belirlemek için aşağıdaki kod kullanılır.

(0, "ScreenDepth") ans = 32 alın

MATLAB, piksel başına bit sayısını döndürür:

Anlam Açıklama
8 8 bitlik gösterim 256 renkte görüntülenir. 8 bit gri tonlamalı görüntüler parçası Grafik bilgilerinin 24 bit gösterimi.
16 16 bitlik bir gösterim, tipik olarak, kırmızı, yeşil ve mavi için 32 tonlamaya (yani, 25) eşit olan, renk bileşeni başına 5 bit kullanır. Sonuç olarak, bu görünüm 32.768 (yani 2 15) farklı rengi destekler. Bazı sistemler kullanır fazladan bit Görüntülenen rengin tonlama sayısını artırmak için Bizim durumumuzda, 16 bitlik bir gösterimdeki farklı renklerin sayısı 64,536'dır (yani 2 16).
24 24 bit işleme, üç renk bileşeninin her biri için 8 bit kullanır, yani. Kırmızı, yeşil ve mavi bileşenler için 256 (2 8) derecelendirme. Sonuç 16.777.216 (yani 2 24) farklı renktir.
32 32 bit işleme, renk bilgilerini depolamak için 24 bit kullanır ve verilerin doygunluğunu (saydamlığını) depolamak için 8 bit daha kullanılır. Bu sözde alfa kanalıdır.

Renk derinliği seçiminin açıklaması

Kullanmakta olduğunuz sisteme bağlı olarak, ayarlayabilirsiniz. Farklı anlamlar piksel başına bit sayısı. (izinle de ilgili olabilir grafik nesneleri... Çoğu durumda, 24 bitlik bir temsil, iyi bir işleme sağlar. Piksel başına daha az bit kullanılması gerekiyorsa, 16 bitlik bir gösterim kullanılabilir. Gri tonlamalı görüntüleri işlerken çoğu durumda piksel başına 8 bit yeterlidir.

Görüntüdeki renk sayısını azaltma

Bu madde, dizindeki renklerin sayısını azaltmak için bir yöntemi açıklar veya RGB görüntüleri NS. Dithering yöntemini de göz önünde bulundurun. Bu teknik, görüntüdeki renk sayısında görsel bir artış kullanır.

Aşağıda kısa açıklamalar uygulamada görüntüdeki renkleri azaltma işlevleri Görüntü işleme Araç kutusu.

24 bit ekranlı sistemlerde RGB renkleri görüntüler 16.777.216 (yani 2 24) renkte görüntülenebilir. Daha az RGB renginin görüntülendiği sistemlerde, MATLAB otomatik olarak renk yaklaşımı ve difüzyon taklidi kullandığından görüntüler de iyi görüntülenecektir.

İndeks görüntülerinde çok sayıda renkle ilgili sorunlar olabilir. Çoğunlukla 256 renkle sınırlıdır. Bu, aşağıdaki nedenlerden kaynaklanmaktadır:

  • 8 bit görüntüleme sistemleri, tüm renkler sistem tarafından temsil edilemediğinden 256'dan fazla renge sahip dizin görüntülerini oluşturmak için renk taklidi kullanır.
  • Bazı sistemlerde, bir palet prensipte 256'dan fazla pozisyona sahip olamaz.
  • İndeks görüntüsü 256'dan fazla renk içeriyorsa, MATLAB görüntü verilerini uint8 biçiminde değil, çift duyarlıklı biçimde bir dizide saklar. Bu, her piksel 64 bit olduğu için depolanan veri miktarında bir artışa yol açar.
  • Görüntü dosyaları büyük boy tercihen işleme için 256 renk kullanan bir biçimde yazılır. Aynı formatta kayıt yaparken (imwrite işlevini kullanarak), görüntüler 256'dan fazla renge sahipse, daha fazla oluşturma hataları mümkündür.

İndeks görüntüsündeki renk sayısını azaltma

rgb2ind'i kullanma

rgb2ind işlevi, bir RGB görüntüsünü bir dizin görüntüsüne dönüştürerek görüntülenen renk sayısını azaltır. Orijinal görüntüyü işlerken, işlev aşağıdaki renk yaklaşımı yöntemlerini kullanır:

  • niceleme
    • düzgün nicemleme
    • En az varyans niceleme
  • palet ekranı

Ortaya çıkan görüntünün kalitesi, seçilen yaklaşım yöntemine, orijinal görüntüdeki renk aralığına ve difüzyon taklidi yönteminin kullanımına bağlıdır. Yöntemlerin sonuçlarının da büyük ölçüde belirli görüntüye bağlı olduğunu unutmayın.

niceleme

Niceleme, görüntüdeki renk sayısında bir azalmaya yol açar. rgb2ind işlevi, renk azaltma algoritmasının bir parçası olarak nicelemeyi kullanır. rgb2ind işlevi iki niceleme yöntemini destekler: tek tip niceleme ve en az varyans niceleme.

Bu konu düşünüldüğünde küp kavramı uygulanır. RGB renkleri... Bir RGB renk küpü üç boyutlu dizi bu veri türü için tanımlanan tüm renkler. MATLAB'daki görüntüler şu şekilde temsil edilebildiğinden, farklı formatlar(uint8, uint16 veya double), bu RGB küpündeki renklerin örneklenmesini etkiler.

Tek tip kuantizasyon. Tek tip niceleme gerçekleştirmek için uygun parametrelerle rgb2ind işlevini kullanın.

Aşağıda tek tip nicelemenin bir örneği verilmiştir. İkinci argüman nicelemenin ayrıklığını etkiler.

RGB = imread ("peppers.png"); = rgb2ind (RGB, 0.1);

Görüntü, uint8 formatında temsil edilen bir görüntünün tek tip nicelleştirilmesini gösterir. Kolaylık sağlamak için, görüntü kırmızının 0 ve yeşil ve camgöbeği aralığının olduğu bir renk küpünün 2B dilimini gösterir.

En az varyans niceleme. En az varyansla niceleme uygulamak için, sonuçtaki görüntüdeki maksimum renk sayısını gösteren rgb2ind işlevi kullanılır. Bu sayı, RGB renk küpünün bölüneceği hücre sayısını belirler. 185 renk kullanarak bir indeks görüntüsü oluşturmak için nicemleme yönteminin uygulanmasına bir örnek düşünelim.

RGB = imread ("peppers.png"); = rgb2ind (RGB, 185);

En az varyans niceleme yöntemi, piksellerin değerleri arasındaki sapmalara göre gruplar halinde birleştirilmesine dayanır. Onlar. seçilen piksel, gruptaki tüm piksellerden en küçük toplam sapmaya sahip olmalıdır.

İndeks görüntüsündeki renk sayısını azaltma

imyaklaşık işlevi, görüntüdeki renk sayısını azaltmak için de kullanılır. imyaklaşık işlevi bazı yaklaşım tekniklerini kullanır. Temel olarak, imabout işlevi önce ind2rgb işlevini kullanarak görüntüyü RGB'ye dönüştürür ve ardından rgb2ind işlevini, değişen sayıda renkle bir dizin görüntüsüne dönüştürmek için kullanır.

Örnek.
Sırasıyla rgb2ind ve imabout işlevlerini kullanarak 128 ve 16 renk içeren bir görüntü oluşturma örneğini düşünün.

L = imread ("peppers.png"); şekil, imshow (L);


Orijinal görüntü

L = im2double (L); = rgb2ind (L, 128); şekil, imshow (x, harita);


128 renkli görüntü

Yaklaşık (x, harita, 16); şekil, imshow (Y, yeni harita);


16 renkli görüntü

İşlenen görüntünün kalitesi, hangi yaklaşım yönteminin kullanıldığına, üzerindeki renk sayısına bağlıdır. orijinal görüntü Dithering yönteminin kullanılıp kullanılmadığı. Bunu not et farklı yöntemler farklı görüntüler için farklı sonuçlar verir.

Renk geçişlerini yumuşatma

difüzyon taklidi

Görüntüdeki renk sayısını azaltmak için rgb2ind veya imabout işlevlerini kullanırken, ortaya çıkan görüntünün kalitesi biraz daha düşüktür. Bunun nedeni, görüntünün görüntülendiği renk sayısındaki azalmadır. Hem rgb2ind hem de imabout, renk taklidi yöntemini kullanır. Bu yol açar görsel artış görüntülenen renk sayısı. Titreşim yöntemi, komşuluğun ortalama rengi orijinal RGB rengine yaklaşacak şekilde komşu piksellerin renklerini değiştirir.

Dithering yönteminin nasıl çalıştığına dair bir örneğe bakalım.

  1. Orijinal görüntünün okunması ve işlenmesi. rgb = imread ("onion.png"); imshow (rgb);

  2. Titreşim olmadan sekiz renkli bir dizin görüntüsü oluşturur. = rgb2ind (rgb, 8, "nodither"); şekil, imshow (X_no_dither, harita);

  3. Difüzyon renk taklidi yöntemini kullanarak sekiz renkli bir dizin görüntüsü oluşturur. = rgb2ind (rgb, 8, "titreşim"); şekil, imshow (X_dither, harita);

    Difüzyon renk taklidi yöntemi kullanılarak görüntünün işlenmesinin, görüntülenen renklerde görsel bir artışla sonuçlandığını unutmayın. Ancak, yanlış kontur riski vardır.

    Renk alanı dönüştürme gerçekleştirme

    Renk verilerini renk uzayları arasında dönüştürme

    Tanımlamak için çoğu zaman Görüntü İşleme Araç Kutusu'nda dijital görüntüler tarafından kullanılan renk sistemi RGB. Bu durumda, paletteki sütunlar kırmızı, yeşil ve mavi bileşenlerin yoğunluklarını temsil eder. Palet görüntüleri rastgele bir renk derinliğine sahip olabilir, ancak palet görüntüleri sırasıyla 4 ve 8 bitlik renk derinlikleriyle en yaygın kullanılanlardır.

    Daha büyük bir renk alanından gelen renkleri daha küçük bir renk alanında görüntülemek için bilinen iki yaklaşım vardır. Bunlardan biri, renk alanı dışındaki renklerin, renk alanı içinde ton olarak en yakın renklere dönüştürülmesidir. Bu yaklaşıma kırpma denir. İkinci yöntem Sıkıştırma yöntemidir. Çıkış cihazının renk alanına girip girmediğine bakılmaksızın girişteki her rengin, farklı bir renge dönüştürülmesi gerçeğinden oluşur. Renk aralığıçıkış aygıtı (doğal olarak, uzak rastgele). Mevcut yöntemler renk uzayı dönüşümleri birbirinden üç ana özellikte farklılık gösterir: renk gamı ​​sıkıştırma, ton eşleme (giriş cihazının dinamik aralığını çıkış cihazına getirme) ve beyaz noktayı görüntüleme.

    Cihaza bağlı renk uzayları arasındaki dönüşümler

    RGB ve CMYK olmak üzere iki renk uzayını düşünün. RGB uzayındaki herhangi bir renk toplam olarak oluşturulur. farklı miktarlar kırmızı, yeşil ve mavi bileşenler. Tüm bileşenlerin değerleri sıfıra eşit olduğunda siyah renk oluşur. Tüm bileşenler mümkün olan maksimum değeri alırsa, beyaz oluşur. Ancak, "beyaz" kavramı yaklaşıktır. Gerçek şu ki, RGB bileşenleri yalnızca iyi bir yaklaşım sağlar ve gerçek beyaz, yalnızca R, G ve B'yi değil, yalnızca tüm spektral bileşenlerini ekleyerek elde edilebilir. CMYK uzayında beyaz, tüm bileşenlerinin sıfırlanmasıyla elde edilir ve Camgöbeği (C, Camgöbeği), Macenta (M, Macenta) ve Sarı (Y, Sarı) diğer renkleri oluşturmak için kullanılır. Bu renk uzayının dezavantajı, onu kullanan cihazların canlı ve doygun renkleri görüntüleyememesidir.

    RGB ve CMYK renk uzayları cihaza bağlıdır, çünkü içlerindeki renk, bu değerlerin ayarlandığı belirli bir cihaza bağlıdır. Bir "aygıt" bir yazıcı, tarayıcı, monitör vb. olabilir. Aslında, her yazıcı, tarayıcı veya monitör aynı görüntüyü kendi renklerinde gösterecektir, ancak RGB değerleri aynı şekilde servis edilirler.

    Genel olarak, bir renk koordinatları ile tanımlanabilir. bu set ana renkler veya renklilik koordinatları ve parlaklık seviyeleri. Renk, renk koordinatlarının veya renklilik ve luma koordinatlarının doğrusal veya doğrusal olmayan bir işlevi kullanılarak tanımlanabilir. Doğrusal dönüşümler renk koordinatları, yeni bir renk kümesine geçişi temsil eder. Mevcut sistemler renk koordinatları, renkleri ve dönüşüm formüllerini nicel olarak tanımlamanıza olanak tanır.

    Tablo, Matlab görüntü işleme uygulaması tarafından desteklenen aygıta bağlı renk uzaylarını listeler.

    İşlev Randevu Randevu
    XYZ 1931 yılında ICE (Uluslararası Aydınlatma Komisyonu) tarafından geliştirilen spektral ana renklerin koordinat sistemi. xyY, uvL, u "v" L ve L * a * b *
    xyY Normalleştirilmiş kromatik değerlerin elde edilmesinin açıklaması. Y bileşeni, XYZ sisteminde olduğu gibi, parlaklığı temsil eder. XYZ
    uvL Eşit kontrast koordinat sistemi. L parlaklığı temsil eder ve XYZ'deki Y'ye benzer. XYZ
    u "v" L Gelişim eski sistem kromatiklik ve parlaklıktaki tek değişikliklerin aynı şekilde algılandığı bir renk uzayı elde etmek için. XYZ
    L * bir * b * Algı ve parlaklığın bağımlılığını hesaba katma girişimi. L * doğrusal olmayan ölçeklemeyi temsil eder L bazı noktalara göre normalize edilmiştir. XYZ
    L * ch Bu modelde c ve h sırasıyla doygunluğu ve kromayı temsil eder. V kutupsal koordinatlar bu sistem dönüştürülür L * bir * b *. L * bir * b *
    sRGB Ortalama bir CRT monitörün renk gamıyla eşleşen bir renk alanı. XYZ ve L * a * b *

    Örnek: Görüntüleri farklı renk uzaylarında temsil etme

    içindeki görüntüyü sayıyoruz RGB formatı v çalışma alanı MATLAB ve renk verilerini dönüştürmek renk uzayı XYZ:

Dikkat çeker

Örneğin, iyi eski GIF formatı maksimum 256 renk içeren bir palet kullanır. Bir dizi özçekiminizi gif-animasyon olarak kaydetmek istiyorsanız (kimin ihtiyacı varsa), o zaman sizin veya daha doğrusu bunun için kullanacağınız programın yapmanız gereken ilk şey - bir palet oluşturmak. Statik bir palet kullanabilirsiniz, örneğin web uyumlu renkler, niceleme algoritması çok basit ve hızlıdır, ancak sonuç çok iyi olmayacaktır. Görsel olarak orijinaline en çok benzeyen sonucu verecek olan görüntünün renklerine göre en uygun paleti oluşturabilirsiniz.

En uygun paleti oluşturmak için çeşitli algoritmalar vardır, her birinin kendi artıları ve eksileri vardır. Okuyucuyu sıkıcı teori ve formüllerle rahatsız etmeyeceğim, ilk olarak tembelim ve ikincisi, çoğu bununla ilgilenmiyor - sadece resimlere bakarak makaleyi gözden geçiriyorlar.

Ardından, medyan bölüm yöntemi, Floyd-Steinberg hata saçılım algoritması (niceleme gürültüsü) (ve sadece değil), insan gözünün renk algısının özellikleri ve biraz bok hakkında sıkıcı ve anlaşılmaz bir hikaye bulacaksınız. kod.

Arka plan

Uzun zaman önce, Nokia'nın sıcak olduğu ve akıllı telefon pazarına lambanın hakim olduğu ve akıllı telefon sahiplerinin kendilerini gururla "akıllı telefonlar" olarak adlandırdıkları o eski zamanlarda, seri için basit python programları yazdım60. Geçen gün arşivleri karıştırırken bunlardan birine rastladım. GifTool, bir dizi resimden gif animasyonu oluşturmak için bir programdır. İçinde medyan bölüm nicelemeyi, LZW sıkıştırma algoritmasını uyguladım, tüm dosya yapısı bağımsız olarak oluşturuldu, bir sonraki slaytta değişmeyen pikseller için, son dosya boyutunu azaltmak için şeffaflık kullanıldı. Hafızamı tazelemek, nasıl çalıştığını görmek istedim. Kodu açtım ve... On yıl önceki boktan kodunuzu bulamadığınız bir his. O zamanlar PEP8'i bilmiyordum, bu yüzden kodun okunabilirliği hiç yoktan biraz daha azdı (o zaman pek çok acemi programcı gibi minimalizmi sevdim). Gözyaşları döktüm, tükürdüm, onu PyCharm'da yeniden düzenledim, medyan bölüm yöntemini nasıl uygulayacağımı anladım ve çabucak "kirli" bir komut dosyası attım. İşler! Palet oluşturulur, çıktı görüntüsü tolere edilebilir. Ve sonra ısırıldım - başarabilir miyim daha iyi sonuçlar böylece resim görsel olarak orijinaline mümkün olduğunca yakın olur.


Yani - ortanca bölüm yöntemi. Çok basit. İlk adım, görüntünün tüm benzersiz renklerinden bir RGB küpü oluşturmaktır. Ardından, en uzun kenar boyunca kesin. Örneğin, kırmızı aralığı 7 ila 231 (uzunluk 231-7 = 224), yeşil aralığı 32 ila 170 (uzunluk 170-32 = 138), mavi 12 ila 250 (uzunluk 250-12 = 238) ), bu yüzden mavi taraftaki küpü "Keseceğiz". Ortaya çıkan parçaları da uzun kenar boyunca keseriz, vb. 256 segment elde edene kadar. Her segment için ortalama rengi hesaplayın - paleti bu şekilde alıyoruz.

Netlik için birkaç resim neredeyse konunun içinde.



Burada ne geliştirilebilir? Akla gelen ilk şey, tüm renkleri aptalca toplayıp sayılarına [toplam (renk) / sayı (renk)] bölerek ortalama rengi hesaplamak, ancak her bir rengin görüntüde kaç kez geçtiğini dikkate almaktır. . Yani, her rengi görüntüdeki oluşum sayısı ile çarparız, elde edilen değerleri ekleriz, sonucu bu segmentin tüm renklerinin görüntüdeki oluşum sayısına böleriz [toplam (renk * toplam) / toplam (toplam) )]. Sonuç olarak, en yaygın renkler hesaplamada önceliğe sahiptir, ancak nadir renkler de kendi ayarlarını yapar, bu nedenle palet daha iyidir, görsel renk sapması daha azdır. En iyi sonuçlar için gamı ​​da hesaba katmanız önerilir, ancak bunu sonraya bıraktım. İkincisi o kadar açık değil - medyan bölüm, renk algısının özelliklerini hiç hesaba katmıyor. insan gözü... Yeşilin tonlarını mavinin tonlarından çok daha iyi algılarız. Bu yanlış anlamayı düzeltmeye ve küpü "düzleştirmeye" karar verdim - kenarların uzunluklarını bu makaledeki katsayılarla çarparak. Sonuç olarak, yeşil ve kırmızı kenarlarda daha fazla ve mavi kenarlarda daha az kesit vardır. Başka hiçbir yerde böyle bir çözüm görmedim (belki kötü bakıyordum), ama sonuç ortada.

Artık ideal bir paletimiz var, elbette ideal değil (daha da geliştirilebileceğini biliyorum), ancak yeterince iyi. Sonraki adım- görüntünün renklerini indeksleme. En basit seçenek, rengin hangi segmentte bulunduğu, yani indekstir. Hızlı ve kolay. Ama bir tane var ve bir tane bile yok, yani bu adım Geri geleceğiz.

Ortaya çıkan görüntünün kalitesini iyileştirmenin başka bir yolu daha var - hata dağılımı. Burada da her şey oldukça basittir - paletin karşılık gelen rengini indekslenmiş renkten çıkarırız, bir hata alırız, en ünlü Floyd-Steinberg formülü olan belirli bir formüle (şablon) göre komşu piksellere dağıtırız. Kullandım. Hatalar dağıldığında, renkler arasındaki keskin geçişler bulanıklaşıyor ve görsel olarak görüntünün daha fazla gölge (renk) içerdiği görülüyor. İlgileniyorsanız - hataların dağılımı hakkında ayrıntılı ve ilginç bir şekilde okuyabilirsiniz. Ayrıca, hatayı aynı katsayılarla çarparak bu algoritmayı bitirmeye karar verdim, ortaya çıktığı gibi, çok İyi bir fikir- mavi aralığın kesitleri küçüldüğünden, içinde önemli bir hata elde edildi ve saçılma katsayılarıyla hatayı düzeltmeden, saçılma çok fazla "gürültü" getirdi.

Şimdi tekrar indekslemeye geri dönebilirsiniz. Saçılma hatalarıyla piksellerin renklerini değiştiririz ve RGB küpümüzde olmayanları elde ederiz (unutmayın, yalnızca görüntünün renklerinden oluşur). Artık bir indeks atamak için rengin hangi segmentte olduğuna bakamazsınız. Çözüm hemen bulundu - paletteki en yakın rengi arıyor. V bu formül Aynı katsayıları yerine koydum. Orijinal rengi içeren segmentin indeksi ile palet rengi seçiminin sonuçlarını ve en yakın rengi aramanın sonuçlarını karşılaştırdığımda, en yakın rengin genellikle komşu segmentte göründüğünü açıkça gördüm. Orijinal renk segmentin merkezine daha yakınsa, segment indeksi paletteki renk indeksine karşılık gelir, ancak orijinal renk segmentin kenarlarına ne kadar yakınsa, en yakın rengin o kadar olasıdır. bitişik segmentte olmak. Genel olarak, tek doğru yol indeksleme - paletteki en yakın rengi arayın. Ancak aramanın bir dezavantajı var - yavaş, çok yavaş. Python'da bir sayı kırıcı yazmak kötü bir fikirdir.

Şey, kısaca açıklamak istedim, ama bir sürü anlaşılmaz yazı olduğu ortaya çıktı. Umarım açıkladığımdan daha iyi kod yazıyorum, işte github'a bir bağlantı. Kod birkaç kez yeniden yazıldı, ilk başta algoritma, sonuç bana uygun olana kadar geliştirildi, sonra fotoğrafları işlerken çok fazla RAM tükettiği ortaya çıktı (önce küçük resimler üzerinde test edildi), RGB küpünü aktarmak zorunda kaldım, ortanca bölüm ve piksel eşlemesi veritabanına ( sqlite). Komut dosyası çok yavaştır, ancak sonuç, PIL / Yastık ve GIMP aracılığıyla nicelemeden daha iyidir (bu işleme dizinleme denir).

Görsel gösteri:

orijinal

GIMP'de niceleme sonucu, 256 renk için optimal palet + Floyd-Stenberg'e göre renk bulanıklığı (normal)

PIL / Yastık niceleme sonucu image.convert (mod = "P", renk taklidi = PIL.Image.FLOYDSTEINBERG, palet = PIL.Image.ADAPTIVE, renkler = 256)

Koduma göre nicelenmiş sonuç

Ne aranmalı: GIMP'de hata dağılımı çok "gürültülü", PIL / Yastık çok optimal olmayan bir palet oluşturur ve pratikte hataları dağıtmaz (renkler arasında keskin geçişler).
Farkı göremiyorsanız, github'daki diğer örneklere bakın.


Not: bu görevle daha iyi ve daha hızlı başa çıkan harika bir program Color Quantizer var, bu yüzden senaryomun pratik bir anlamı yok, sadece "spor" ilgisinden yapılmış.
UPD: projeyi github'da güncelledi. Octree niceleme algoritması (octree), popüler hata saçılım formülleri eklendi, ortalama kırmızı değerine göre en yakın rengi arayın.

Dipnot: Tanıtım. Tek tip renk uzayı bölümlemesi için algoritma. Oluş sıklığına göre bölme algoritması: algoritma fikri, renkli küp bölme yöntemi - yerel olarak sıralanmış arama. Medyan bölüm algoritması. Görüntü niceleme için kümeleme yöntemleri: K-ortalama yöntemi, çizge bağlantı yöntemi, hiyerarşik yöntem, genelleştirilmiş K-ortalama yöntemi veya dinamik yoğunlaştırma yöntemi. Çözüm.

12.1. Tanıtım

Dönüştürme işlemi analog sinyal v dijital formüç aşamadan oluşur: örnekleme ("Örnekleme. Kenar yumuşatma. Raster görüntülerin geometrik dönüşümleri"), niceleme ve kodlama. Bu ders ikinci aşama ile ilgilidir. niceleme referans değerin sabit değerler kümesinden en yakın değerle değiştirilmesidir. Görüntüler için bu, her piksel için öznitelik değerlerinin sayısını azaltmak veya daha basit olarak görüntüdeki renk sayısını azaltmak anlamına gelir. Bu, görüntü kalitesinin mümkün olduğunca az bozulmasını gerektirir. Kuantizasyon işlemi ayrıca halihazırda sayısallaştırılmış malzemeye de uygulanır.

Aşağıdakiler için niceleme gereklidir:

  • hafıza tasarrufu;
  • sıkıştırma için dizilerin özelliklerinde iyileştirmeler;
  • sonraki işlemler için hazırlık;
  • efektler ekleme.

Resimlerle ilgili olarak bu noktalar hakkında daha ayrıntılı yorum yapalım.

Bellekteki tasarruflar, öznitelik değerlerinin depolanması maliyetinin düşürülmesiyle açıkça elde edilir. PNG, GIF gibi birçok görüntü depolama formatı 1, öznitelik değerlerini depolamak yerine referans numaralarını palet satırlarında depolar. Palet, satırları sabit bir öznitelik değeri içeren bir tablodur. Daha önce, 1995'ten önceki video belleği miktarının normal olarak olması nedeniyle, bir görüntüyü ekranda oluşturmak ve görüntülemek için palet mekanizması kullanılıyordu. masaüstü bilgisayar bir megabaytı geçmedi.

Sıkıştırma dizilerinin özelliklerinin iyileştirilmesi, olası değerlerin sayısını azaltarak ve dolayısıyla tekrarları artırarak elde edilir.


Pirinç. 12.1.

Karmaşıklığı önemli ölçüde olası öznitelik değerlerinin sayısına bağlı olan bazı algoritmalar için son işleme için hazırlık gereklidir. Ayrıca, algoritmanın sonucu genellikle aynıdır veya sadece biraz farklıdır.

Niceleme görüntüleri, sanatsal efektler eklemek ve sınırları vurgulamak için kullanılabilir.

Bu bölümde, görüntü pikseli özniteliklerinin değerlerinin RGB renk uzayında olduğu varsayılır ("Temel kavramlar. Bilgisayar grafiklerinde rengin temsili"). Basitlik için, 8 bitlik gri tonlamalı bir görüntü (256 gölge) için algoritmaların sözde kodları verilmiştir (bkz. Şekil 12.1), çeviri 4 bitlik bir görüntüye (16 gölge) gerçekleştirilir.


Pirinç. 12.2.

12.2. Tek tip renk uzayı bölümlemesi için algoritma

En basit niceleme algoritmasını düşünün - renk uzayı tek tip bölümleme algoritması, olarak da adlandırılır lineer nicemleme... Ana yönlerin her biri için renk alanını eşit parçalara bölün (RGB için bileşen sayısına göre bu tür üç yön vardır). Örneğin, mavi veya yeşil eksen yönünde (bkz. Şekil 1.5), küpü 8 parçaya ve kırmızı olan yönünde - 4'e bölüyoruz. Bölümlerin kesiştiği noktada oluşan değerler kümesi tabloya girilecektir. Örneğimizde RGB küpü üzerine eşit olarak dağıtılmış 256 değer elde ediyoruz. Ayrıca, görüntünün dönüşümü, tabloda karşılık gelen sayıyı bulmaya indirgenir, böylece gerçek renk ile değiştirilmesi arasındaki mesafe minimum olur. Bu yuvarlama ile hızlı bir şekilde yapılabilir.

// 16 / 256 gri tonu yap // I (piksel) - piksel özniteliği // Yeni (piksel) yeni öznitelik - paletteki bağlantı numarası // Palet - palet // orijinal görüntüdeki gölge sayısı NOldColors = 256; // paletteki eleman sayısı NNewColors = 16; // 1. Paleti (i = 0; i) için doldurun< NNewColors; i++) { Palette[i] = i * (NOldColors / NNewColors); } // 2. Вычиcляем новые значения атрибутов foreach(pixel in I) // для каждого пикселя { // округляем, отбрасывая kesirli kısım Inew (piksel) = I (piksel) / (NOldColors / NNewColors); ) Liste 12.1. Tek tip renk uzayı bölümlemesi için algoritma

Çalışmanın sonucu olarak bu algoritma (bkz. şek. 12.2) görüntüde genellikle çok net sınırlar belirir ve tam tersine ayrıntılar silinir. Ancak, bu algoritmanın ana avantajları basitlik ve yüksek hızdır.

Bilgi işleme sisteminde, sinyaller kural olarak alınır. şimdiki zaman... Bilgisayar işleme için sürekli sinyalleröncelikle bunları dijitale çevirmek gerekiyor. Bunun için örnekleme ve nicemleme işlemleri yapılır.

Görüntü örnekleme

Örnekleme Sürekli bir sinyalin bir sayı dizisine (örneklere) dönüştürülmesi, yani bu sinyalin bazı sonlu boyutlu bir temelde temsil edilmesidir. Bu görünüm, bir sinyalin belirli bir temele yansıtılmasından oluşur.

İşleme organizasyonu ve doğal örnekleme yolu açısından en uygun olanı, sinyallerin değerlerinin (örneklerin) bir örneği şeklinde ayrı, düzenli aralıklarla noktalar halinde sunulmasıdır. Bu yöntem denir rasterleştirme ve örneklerin alındığı düğümlerin sırası raster... Sürekli sinyalin değerlerinin alındığı aralığa denir. örnekleme adımı... Adımın tersi olan değere denir. örnekleme oranı,

Örnekleme sırasında ortaya çıkan önemli bir soru: Bu örneklerden geri yükleyebilmek için sinyalin örnekleri hangi sıklıkta alınır? Açıkçası, numuneler çok nadiren alınırsa, hızla değişen bir sinyal hakkında bilgi içermeyeceklerdir. Bir sinyalin değişim hızı, spektrumunun üst frekansı ile karakterize edilir. Bu nedenle, izin verilen minimum örnekleme aralığı, sinyal spektrumunun en yüksek frekansı ile ilgilidir (bununla ters orantılıdır).

Tek tip örnekleme durumunda, bu doğrudur. Kotelnikov teoremi, 1933'te yayınlanan “On Bant genişliği telekomünikasyonda eter ve tel ”. Diyor ki: sürekli bir sinyalin frekans sınırlı bir spektrumu varsa, o zaman bir periyot ile alınan ayrık örneklerinden tamamen ve açık bir şekilde yeniden oluşturulabilir, yani. frekans ile.

Sinyal kurtarma işlevi kullanılarak gerçekleştirilir ... Kotelnikov, yukarıdaki kriterleri karşılayan sürekli bir sinyalin bir dizi olarak gösterilebileceğini kanıtladı:

.

Bu teoreme örnekleme teoremi de denir. fonksiyon da denir sayma işlevi veya Kotelnikov 1915'te Whitaker tarafından bu tip bir enterpolasyon dizisi çalışılmasına rağmen. Sayma fonksiyonu zaman içinde sonsuzdur ve en büyük değerine ulaşır, bire eşit, simetrik olduğu noktada.

Bu işlevlerin her biri bir ideale yanıt olarak görülebilir. filtre düşük frekanslar (LPF) o anda gelen delta darbesi. Bu nedenle, ayrık örneklerinden sürekli bir sinyali geri yüklemek için bunların karşılık gelen düşük geçişli filtreden geçirilmesi gerekir. Böyle bir filtrenin nedensel olmadığı ve fiziksel olarak gerçekleştirilemez olduğu belirtilmelidir.

Yukarıdaki oran olasılık anlamına gelir doğru restorasyonörneklerinin sırasına göre sınırlı bir spektruma sahip sinyaller. Sınırlı spektrum sinyalleri- bunlar, tanım alanının yalnızca sınırlı bir bölümünde Fourier spektrumu sıfır olmayan sinyallerdir. Optik sinyaller bunlara atfedilebilir, çünkü elde edilen görüntülerin Fourier spektrumu optik sistemler, öğelerinin sınırlı boyutu nedeniyle sınırlıdır. frekans denir Nyquist frekansı... Bu, giriş sinyalinde üzerinde hiçbir spektral bileşen olmaması gereken kesme frekansıdır.

Görüntüleri niceleme

Dijital görüntü işlemede, sürekli dinamik parlaklık değerleri aralığı, bir dizi ayrık seviyeye bölünür. Bu prosedür denir nicemleme... Özü, sürekli bir değişkenin sonlu bir değerler kümesi alan ayrık bir değişkene dönüştürülmesinde yatar. Bu değerler denir nicemleme seviyeleri... Genel durumda, dönüşüm bir adım fonksiyonu ile ifade edilir (Şekil 1). Görüntü örneğinin yoğunluğu aralığa aitse (yani, ne zaman ), daha sonra orijinal numune, niceleme seviyesi ile değiştirilir; niceleme eşikleri... Dinamik parlaklık değerleri aralığının sınırlı ve eşit olduğu varsayılmaktadır.

Pirinç. 1. Kuantizasyonu tanımlayan fonksiyon

Bu durumda ana görev, eşiklerin ve niceleme seviyelerinin değerlerini belirlemektir. Bu sorunu çözmenin en basit yolu, dinamik aralığı eşit aralıklara bölmektir. Ancak, bu en iyi çözüm değildir. Görüntü örneklerinin çoğunun yoğunluk değerleri, örneğin "karanlık" bölgede gruplandırılmışsa ve düzey sayısı sınırlıysa, eşit olmayan şekilde niceleme yapılması önerilir. "Karanlık" bölgede, "aydınlık" bölgede daha sık ve daha az sıklıkla niceleme yapmak gerekir. Bu, niceleme hatasını azaltacaktır.

Sayısal görüntü işleme sistemlerinde, bir görüntüyü kodlamak için gereken bilgi miktarı onların sayısına bağlı olduğundan, seviye ve niceleme eşiklerinin sayısını azaltmaya çalışırlar. Bununla birlikte, nicelenmiş bir görüntüde nispeten az sayıda seviye ile yanlış konturlar görünebilir. Kuantize görüntünün parlaklığındaki ani bir değişimin bir sonucu olarak ortaya çıkarlar ve özellikle değişimin sığ alanlarında fark edilirler. İnsan görüşü özellikle konturlara duyarlı olduğundan, yanlış konturlar görüntünün görsel kalitesini önemli ölçüde düşürür. Tek tip niceleme ile tipik görüntüler en az 64 seviye gerektirir.