Ho problemi con la segmentazione dell'immagine a basso contrasto. Il compito è trovare i difetti di superficie. Sono visibili (i difetti sono sempre aree scure) ma il contrasto dell'immagine è molto basso. Sotto due campioni.Segmentazione dell'immagine a basso contrasto
Ho provato migliorare il contrasto e quindi tresholding:
Mat tmp1 = imread("C:\\framesRoi\\311.bmp",0);
stretchContrast(tmp1);
threshold(tmp1,tmp1,75,255,THRESH_BINARY);
cui tratto impl contrasto:
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);
}
}
Ma questo approccio non è riuscito. Ci sono molti falsi rilevamenti e non vengono rilevati tutti i difetti:
Ecco zip con telai di prova: https://dl.dropboxusercontent.com/u/47015140/testFrames.rar
Quando si esegue un tratto contrasto in base al contenuto dell'immagine, si perde il contesto necessario per prendere una soglia utile. –
@MarkRansom: quindi come dovrei farlo? – krzych
Se si sa che i difetti saranno sempre scuri, è possibile regolare la luminosità senza modificare il contrasto in modo che le aree luminose siano coerenti. Puoi farlo con il massimo, anche se usare un 90 ° percentile o meno sarebbe meno vulnerabile al rumore. –