//改进LCM算法
Mat ImproveLCM(const Mat& SrcImg, int ksize)
{
if (SrcImg.channels() != 1)
cvtColor(SrcImg, SrcImg, CV_RGB2GRAY);
Mat resultImg = SrcImg.clone();
int delta = ksize + ksize / 2;
double m[9] = { 0 };
for (int i = delta; i < SrcImg.rows - delta; i++)
{
for (int j = delta; j < SrcImg.cols - delta; j++)
{
#if 1
//初始化0
for (int k = 0; k < 9; k++)
{
m[k] = 0;
}
//中心块
double maxValue = 0; //中心块最大值
for (int i0 = i - ksize / 2; i0 <= i + ksize / 2; i0++)
{
for (int j0 = j - ksize / 2; j0 <= j + ksize / 2; j0++)
{
m[0] += SrcImg.at<uchar>(i0, j0);
if (SrcImg.at<uchar>(i0, j0) > maxValue)
{
maxValue = SrcImg.at<uchar>(i0, j0);
}
}
}
//1
for (int i1 = i - ksize - ksize / 2; i1 <= i - ksize + ksize / 2; i1++)
{
for (int j1 = j - ksize - ksize / 2; j1 <= j - ksize + ksize / 2; j1++)
{
m[1] += SrcImg.at<uchar>(i1, j1);
}
}
//2
for (int i2 = i - ksize - ksize / 2; i2 <= i - ksize + ksize / 2; i2++)
{
for (int j2 = j - ksize / 2; j2 <= j + ksize / 2; j2++)
{
m[2] += SrcImg.at<uchar>(i2, j2);
}
}
//3
for (int i3 = i - ksize - ksize / 2; i3 <= i - ksize + ksize / 2; i3++)
{
for (int j3 = j + ksize - ksize / 2; j3 <= j + ksize + ksize / 2; j3++)
{
m[3] += SrcImg.at<uchar>(i3, j3);
}
}
//4
for (int i4 = i - ksize / 2; i4 <= i + ksize / 2; i4++)
{
for (int j4 = j - ksize - ksize / 2; j4 <= j - ksize + ksize / 2; j4++)
{
m[4] += SrcImg.at<uchar>(i4, j4);
}
}
//5
for (int i5 = i - ksize / 2; i5 <= i + ksize / 2; i5++)
{
for (int j5 = j + ksize - ksize / 2; j5 <= j + ksize + ksize / 2; j5++)
{
m[5] += SrcImg.at<uchar>(i5, j5);
}
}
//6
for (int i6 = i + ksize - ksize / 2; i6 <= i + ksize + ksize / 2; i6++)
{
for (int j6 = j - ksize - ksize / 2; j6 <= j - ksize + ksize / 2; j6++)
{
m[6] += SrcImg.at<uchar>(i6, j6);
}
}
//7
for (int i7 = i + ksize - ksize / 2; i7 <= i + ksize + ksize / 2; i7++)
{
for (int j7 = j - ksize / 2; j7 <= j + ksize / 2; j7++)
{
m[7] += SrcImg.at<uchar>(i7, j7);
}
}
//8
for (int i8 = i + ksize - ksize / 2; i8 <= i + ksize + ksize / 2; i8++)
{
for (int j8 = j + ksize - ksize / 2; j8 <= j + ksize + ksize / 2; j8++)
{
m[8] += SrcImg.at<uchar>(i8, j8);
}
}
for (int kk = 0; kk < 9; kk++) //求每个子块的均值
{
m[kk] = 1.0 * m[kk] / (ksize*ksize);
}
double mDelta = 0; //八邻域均值
for (int ll = 1; ll <= 8; ll++)
{
mDelta += 1.0 * m[ll] / 8;
}
if (maxValue * m[0] / mDelta > 255)
{
resultImg.at<uchar>(i, j) = 255;
}
else
{
resultImg.at<uchar>(i, j) = maxValue * m[0] / mDelta;
}
#endif
}
}
return resultImg;
}
基于改进的LCM的红外小目标检测算法实现
猜你喜欢
转载自blog.csdn.net/sinat_36412790/article/details/80299305
今日推荐
周排行