Bu örnekte belge görüntü eşiklemesi için en iyi algoritmalar nelerdir?


31

Gösterilen görüntüye çeşitli çiftleştirme algoritmaları uygulamaya çalışıyorum: görüntü tanımını buraya girin

İşte kod:

clc;
clear;
x=imread('n2.jpg');     %load original image

% Şimdi görüntüleri yeniden boyutlandırıyoruz, böylece hesaplama işi bizim için daha sonra daha kolay hale gelecektir.

size(x);
x=imresize(x,[500 800]);
figure;
imshow(x);
title('original image');

z=rgb2hsv(x);       %extract the value part of hsv plane
v=z(:,:,3);
v=imadjust(v);

% şimdi niblack ve% sauvola algoritmaları için gereken ortalama ve standart sapmayı buluyoruz

m = mean(v(:))
s=std(v(:))
k=-.4;
value=m+ k*s;
temp=v;

% niblack eşik algoritması uygulayan:

for p=1:1:500
    for q=1:1:800
        pixel=temp(p,q);
        if(pixel>value)
            temp(p,q)=1;
        else
            temp(p,q)=0;
        end
    end
end
figure;
imshow(temp);
title('result by niblack');
k=kittlerMet(g);
figure;
imshow(k);
title('result by kittlerMet');

% uygulama sauvola eşik algoritması:

val2=m*(1+.1*((s/128)-1));
t2=v;
for p=1:1:500
for q=1:1:800
    pixel=t2(p,q);
    if(pixel>value)
        t2(p,q)=1;
    else
        t2(p,q)=0;
    end
end

son

figure;
imshow(t2);
title('result by sauvola');

Elde ettiğim sonuçlar gösterildiği gibidir: görüntü tanımını buraya girin görüntü tanımını buraya girin görüntü tanımını buraya girin

Gördüğünüz gibi sonuçta elde edilen görüntüler daha karanlık noktalarda bozulmuştur.


1
Arka planı yalnızca parlaklık yerine atmak için renk bilgilerini kullanabilir misiniz?
Endolith

Saygıdeğer Beyefendi / Hanımefendi. Görüntü işleme üzerine proje yapıyorum. Ben ilginç ikilileştirme kavramını yapıyorum. Lütfen kodlamayı kontrol edip düzeltin ... Kodlamayı alıp programı çalıştırırım. diğeri ise msp'teki hatadır (satır 31) k = kittlerMet (g); .. Nasıl çözülür ... Lütfen kodlamayı düzeltin ...
muthu 20:15

Yanıtlar:


49

Görüntünüz düzgün bir parlaklığa sahip değil, bu nedenle düzgün bir eşikle çalışmamalısınız. Uyarlanabilir bir eşiğe ihtiyacınız var. Bu, görüntüdeki parlaklığı daha üniform hale getirmek için görüntüyü önceden işleyerek uygulanabilir (Mathematica'da yazılan kod, Matlab sürümünü kendiniz için uygulamanız gerekir):

Parlaklığı tekdüze yapmanın basit bir yolu, kapanan bir filtreyi kullanarak görüntüdeki gerçek metni kaldırmaktır:

white = Closing[src, DiskMatrix[5]]

görüntü tanımını buraya girin

Filtre boyutu, yazı tipi konturu genişliğinden daha büyük ve kaldırmaya çalıştığınız lekelerin boyutundan daha küçük seçilmelidir.

EDIT: Bir kapanış işleminin ne yaptığını açıklamak için yorumlarda soruldu. Bu bir var morfolojik dilatasyon bir takip morfolojik erozyon . Genişletme esas olarak yapı elemanını görüntüdeki her pozisyonda hareket ettirir ve maskenin altındaki en parlak pikseli alır.

  • yapılandırma elemanından daha küçük karanlık yapıların kaldırılması
  • daha büyük koyu yapıların yapı elemanı boyutuna göre küçültülmesi
  • parlak yapıları büyütmek

Erozyon işlemi tam tersi yapar (yapılandırma öğesinin altındaki en karanlık pikseli seçer), bu nedenle genişletilmiş görüntüye uygularsanız:

  • Yapılandırma elemanından daha küçük oldukları için kaldırılan karanlık yapılar hala gitmiştir.
  • küçülmüş karanlık yapılar tekrar orijinal boyutlarına büyütülür (şekli daha yumuşak olsa da)
  • parlak yapılar orijinal boyutlarına indirgenir

Bu yüzden kapatma işlemi, daha büyük koyu nesnelere ve parlak nesnelere yalnızca küçük değişikliklerle küçük koyu nesneleri kaldırır.

Farklı yapı elemanı boyutlarına sahip bir örnek:

görüntü tanımını buraya girin

Yapılandırma elemanının boyutu arttıkça, karakterlerin sayısı gittikçe artmaktadır. Yarıçap = 5'te, tüm karakterler kaldırılır. Yarıçap daha da artarsa, daha küçük lekeler de çıkarılır:

görüntü tanımını buraya girin

Şimdi (neredeyse) homojen parlaklıkta bir görüntü elde etmek için orijinal görüntüyü bu "beyaz görüntü" ile böldünüz:

whiteAdjusted = Image[ImageData[src]/ImageData[white]*0.85]

görüntü tanımını buraya girin

Bu görüntü şimdi sabit bir eşikle binarize edilebilir:

Binarize[whiteAdjusted , 0.6]

görüntü tanımını buraya girin


5
Vaov! Bu gerçekten havalı! Büyük +1!
Phonon

@nikie +1 Çok hoş - Filtreyi kapatırken tam olarak neyi kastediyorsunuz? Herhangi bir harfin genişliği veya uzunluğu? Ayrıca, 'gerçekten' bir kapanış filtresi ne yapıyor? Teşekkürler!
Spacey,

1
@Mohammad: Cevabımı küçük bir açıklama ekledim. Ve evet, bunlar doğrusal olmayan işlemlerdir. Ortak başlık morfolojik görüntü işlemedir.
Niki Estner,

1
@nikie Boş ver, beyaz, siyah değil, maksimumdur. :-)
Spacey

1
@gdelfino: Genellikle yeterince büyük bir maske kullanarak kaçınmaya çalışıyorum ve eps'in Clip[ImageData[white],{eps,Infinity}]güvenli olması için az sayıdaki yerlerde kullanıyorum .
Niki Estner

6

Nikie'in cevabı en iyi görünüyor ve aynı zamanda çalışıyor ve sonuçlar üretiyor gibi görünüyor. Yani açık bir kazanan.

Ancak, sadece belgelere bir referans daha ekliyorum, bu çok hızlı olabilir.

Bu tekniğe, arka planı açıkça öğrenmeyi gerektirmeyen Uyarlamalı eşikleme denir .

Temel olarak, en uygun global eşiği bulmak yerine - resmi yerel bir pencerede bölümlendirebilir (yaklaşık 7x7 veya uygun) ve pencere geçerken değişen eşikleri bulabiliriz.

Aşağıdaki referans kesin yöntemi detaylandırmaktadır. http://homepages.inf.ed.ac.uk/rbf/HIPR2/adpthrsh.htm

Bu yöntem nispeten hesaplamalı olarak daha hızlı olacaktır.


Bu iki şey aslında aynı değil mi? Yani eşiklemeden önce sinyalin yerel ortalamasını tahmin etmek?
Maurits,

1
@Maurits Ana farklar sıralama ve kullanılan istatistiklerdir. Örneğin, açma / kapama operatörlerinde (dilatasyon ve erozyondan oluşan ancak farklı bir sırada), bir pencere taranır ve taranır ve max alınır. (Diğer şeylerin yanı sıra). Bununla birlikte adaptif eşik değerinde, maks.
Spacey

OP sorduğum SO da sordu . Fakat prensipte, cevaplar arasında bir fark olduğunu sanmıyorum, biri daima yerel istatistikleri tahmin ediyor. Uyarlamalı eşikleme yaparsanız, işlemdeki arka planı da öğrenirsiniz.
Maurits,

6

Bir bant geçiş filtresi kullanarak (MATLAB'da) başka bir yol. Gauss parametrelerinin farkı ile uğraşmak daha iyi sonuçlar verebilir. İşlem temel olarak düşük frekanslı arka plandaki lekeleri çıkarmak için görüntüyü bant geçirir, normalde 'graythresh' komutu için eşik görüntüde [0,1] normalize eder.

Görüntüyü yükle ve gri tonlamalı duble dönüştür:

I = imread('hw.jpg');
I = rgb2gray(I);
I = double(I);

görüntü tanımını buraya girin

Gauss çekirdeği farkını kullanarak filtre uygulayın ve normalleştirin:

J = imgaussian(I,1.5) - imgaussian(I,0.5);
J = J - min(J(:));
J = J / max(J(:));

görüntü tanımını buraya girin

Eşiği hesaplayın ve 010101 yapın:

T = J > graythresh(J);

görüntü tanımını buraya girin


4

Bu, uyarlanabilir eşikleme için iyi bir Matlab kodudur: http://www.mathworks.com/matlabcentral/fileexchange/8647-local-adaptive-thresholding


Ahh! Görüntü işleme araç kutusu olsa da gerektirir. : - /
Spacey

Aslında. Eğer yoksa, üzgünüm. Ancak DIPImage Matlab için ücretsiz bir Image Tolbox. diplib.org/documentation Eşikleme için birkaç yöntem vardır (segmentasyon bölümünü kontrol edin) ve kapanış gibi tüm morfolojik işlemleri de yapabilirsiniz. Geliştiricinin ayrıca bir blogu cb.uu.se/~cris/blog/index.php/archives/tag/matlab
MyCarta

0

Bu kodlamayı deneyeceğim.Ama doğru bir cevabım yok ...

clc;
clear;
x=imread('base2.jpg');
size(x);
x=imresize(x,[500 800]);
figure;
imshow(x);
title('original image');
z=rgb2hsv(x);       %extract the value part of hsv plane
v=z(:,:,3);
v=imadjust(v);
m = mean(v(:))
s=std(v(:))
k=-2;
value=m+ k*s;
temp=v;
for p=1:1:500
    for q=1:1:800
        pixel=temp(p,q);
        if(pixel>value)
            temp(p,q)=1;
        else
            temp(p,q)=0;
        end
    end
end
figure;
imshow(temp);
title('result by niblack');
% k=kittlerMet(g);
% figure;
% imshow(k);
% title('result by kittlerMet');

val2=m*(1+.1*((s/128)-1));
t2=v;
for p=1:1:500
for q=1:1:800
    pixel=t2(p,q);
    if(pixel>value)
        t2(p,q)=1;
    else
        t2(p,q)=0;
    end
end

end
figure;
imshow(t2);
title('result by sauvola');

görüntü tanımını buraya girin

görüntü tanımını buraya girin


2
Bunun soruyu cevaplaması gerekiyorsa, lütfen ne yaptığınızı ve nedenini açıklayın.
Matt L.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.