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
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:
Hier Reißverschluss mit Testrahmen: https://dl.dropboxusercontent.com/u/47015140/testFrames.rar
Wenn Sie eine Kontraststreckung tun, basierend auf dem Bildinhalt, verlieren Sie den Kontext notwendig, eine nützliche Schwelle zu holen. –
@MarkRansom: Wie soll ich das machen? – krzych
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. –