【发布时间】:2015-02-01 14:46:56
【问题描述】:
我遇到了低对比度图像分割的问题。 任务是发现表面缺陷。它们是可见的(缺陷总是暗区),但图像的对比度非常低。 下面是两个示例。
我尝试过增强对比度,然后设置阈值:
Mat tmp1 = imread("C:\\framesRoi\\311.bmp",0);
stretchContrast(tmp1);
threshold(tmp1,tmp1,75,255,THRESH_BINARY);
其中拉伸对比 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);
}
}
但是这种方法失败了。有许多错误检测,并非所有缺陷都被检测到:
这里是带有测试帧的 zip:https://dl.dropboxusercontent.com/u/47015140/testFrames.rar
【问题讨论】:
-
当您根据图像内容进行对比度拉伸时,您会失去选择有用阈值所需的上下文。
-
@MarkRansom : 那我该怎么做呢?
-
如果你知道缺陷总是很暗,你可以在不改变对比度的情况下调整亮度,使亮区保持一致。您可以使用最大值来做到这一点,尽管使用 90% 左右的百分位数会不太容易受到噪音的影响。
-
简单的加法/减法。
-
您是否尝试过其他对比度增强技术?伽马校正呢?直方图均衡化?
标签: c++ opencv image-processing computer-vision