我在低对比度图像分割方面遇到了问题。任务是找出表面缺陷。它们是可见的(缺陷总是暗区域),但是图像的对比度非常低。下面是两个样例。
我尝试了增强对比度,然后进行二值化:
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);
}
}
但是这种方法失败了。有许多虚假检测,并且并没有检测到所有缺陷:
这里是包含测试帧的压缩文件:https://dl.dropboxusercontent.com/u/47015140/testFrames.rar