2014-12-03 2 views
12

Ich habe ein Problem mit der Bildsegmentierung mit geringem Kontrast. Aufgabe ist es, Oberflächenfehler zu finden. Sie sind sichtbar (Fehler sind immer dunkle Bereiche), aber der Kontrast des Bildes ist sehr gering. Unter zwei Proben.Bildsegmentierung mit geringem Kontrast

1 2

ich Kontrast verbessern versucht haben, und dann tresholding:

Mat tmp1 = imread("C:\\framesRoi\\311.bmp",0); 
stretchContrast(tmp1); 
threshold(tmp1,tmp1,75,255,THRESH_BINARY); 

wo Kontrastspreizung impl:

int minValue = 255, maxValue = 0; 
const int l = sourceImg.cols * sourceImg.rows * sourceImg.channels(); 
if(sourceImg.isContinuous()) 
{ 
    uchar* ptr = sourceImg.ptr<uchar>(0); 
    for(int i = 0; i < l; ++i) 
    { 
     if(ptr[i] < minValue) 
     { 
      minValue = ptr[i]; 
     } 
     if(ptr[i] > maxValue) 
     { 
      maxValue = ptr[i]; 
     } 
    } 
} 
cout<<"min: "<<minValue<<";"<<"max value: "<<maxValue<<endl; 

const int magicThreshold = 10; 
if(sourceImg.isContinuous()) 
{ 
    uchar* ptr = sourceImg.ptr<uchar>(0); 
    for(int i = 0; i < l; ++i) 
    { 
     ptr[i] = 255 * (ptr[i]-minValue)/(maxValue - minValue); 
    } 
} 

Aber dieser Ansatz gescheitert. Es gibt viele Falscherkennungen und nicht alle Fehler werden erkannt: 3

Hier Reißverschluss mit Testrahmen: https://dl.dropboxusercontent.com/u/47015140/testFrames.rar

+1

Wenn Sie eine Kontraststreckung tun, basierend auf dem Bildinhalt, verlieren Sie den Kontext notwendig, eine nützliche Schwelle zu holen. –

+0

@MarkRansom: Wie soll ich das machen? – krzych

+2

Wenn Sie wissen, dass die Defekte immer dunkel sind, können Sie die Helligkeit anpassen, ohne den Kontrast zu ändern, damit die hellen Bereiche konsistent sind. Sie können das mit dem Maximum tun, obwohl die Verwendung eines 90. Perzentils oder so stattdessen weniger anfällig für Rauschen wäre. –

Antwort

8

Versuchen Sie, das Bild mithilfe einer Clustermethode wie z. B. kmeans nach Graustufen zu gruppieren. Unten habe ich Kmeans direkt auf den Bildern ohne irgendwelche Graustufentransformationen verwendet (mit 3 Clustern habe ich bessere Ergebnisse erzielt). Sie sollten in der Lage sein, die Ergebnisse zu verbessern, indem Sie ein vorverarbeitetes Bild mithilfe der in den Kommentaren beschriebenen Methoden gruppieren.

enter image description here enter image description here

Form der Cluster leicht variieren kann aufgrund der Zufälligkeit der KMeans.

Wenn Sie jetzt verbundene Komponenten des gruppierten Bildes nehmen und die durchschnittliche Graustufe dieser Regionen berechnen, sollten die Defekte einen niedrigeren Durchschnitt als die anderen Regionen haben.

Ich Clustering Teil in Matlab.

im = imread('r2SOV.png');%Uy1Fq r2SOV 
gr = im; 
size = size(gr); 

% perform closing using a 5x5 circular structuring element 
sel = strel('disk', 2, 4); 
mcl = imclose(gr, sel); 
% cluster gray levels using kmeans: using 3 clusters 
x = double(mcl(:)); 
idx = kmeans(x, 3); 
cl = reshape(idx, size); 

figure, imshow(label2rgb(cl)) 
+0

Beste Antwort so weit. Ich werde warten bis die Bounty abläuft und die beste Antwort akzeptiere. – krzych

4

Da die Menschen in Ihrem Kommentar sagte, können Sie die Helligkeit in einer negativen Art und Weise ändern, und drücken die Kontrast.

Darüber hinaus ist die sharpen filter auch sehr nützlich für Ihren Fall. Sie können this in OpenCV tun.

4

Ich denke, Sie sollten adaptiveThreshold Funktion mit einem großen Fenster versuchen.

#include "opencv2/opencv.hpp" 
using namespace cv; 
int main(int argc,char** argv) 
{ 

    Mat im = imread("c:/data/img1.png",0); 
    cv::namedWindow("ctrl"); 
    int win=62; 
    int th=2100; 
    cv::createTrackbar("win", "ctrl", &win, 500); 
    cv::createTrackbar("th", "ctrl", &th, 10000); 
    while(true) 
    { 
     Mat thresh; 
     medianBlur(im,thresh,15);//helps smooth out smaller noises, which you could also remove by size instead of this way 
     adaptiveThreshold(thresh,thresh,255,ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY,win*2+1,( th/1000.)); 
     imshow("thresh",thresh); 
     if(waitKey(1)==27) 
      exit(0); 
    } 
} 

alle hier Ergebnisse (http://www.datafilehost.com/d/99e3d86c) Vielleicht wollen Sie auch einen Blick auf imagej nehmen, die eine Reihe von Autoschwellen Algorithmen implementiert. Ich denke, was Sie brauchen, ist etwas, das lokale Bildinformationen berücksichtigt.

enter image description here enter image description here