У меня проблема с сегментацией с низким контрастом. Задача - найти дефекты поверхности. Они видны (дефекты всегда темные области), но контраст изображения очень низок. Ниже двух образцов.
Я попробовал усилить контраст, а затем trsholding:
Mat tmp1 = imread("C:\\framesRoi\\311.bmp",0);
stretchContrast(tmp1);
threshold(tmp1,tmp1,75,255,THRESH_BINARY);
где контрастность растяжения:
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);
}
}
Но этот подход не удался. Существует много ложных срабатываний, и не все дефекты обнаружены:
Вот zip с тестовыми кадрами: https://dl.dropboxusercontent.com/u/47015140/testFrames.rar