基于改进的LCM的红外小目标检测算法实现

//改进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;
}

猜你喜欢

转载自blog.csdn.net/sinat_36412790/article/details/80299305
今日推荐