Unger滤波器剔除小的噪点

P:为当前点


//ThresholdImg为阈值分割后的图片
Mat UngerFilter(const Mat& ThresholdImg)
{
	Mat resuktImg = Mat::zeros(ThresholdImg.size(),CV_8UC1);

	for (size_t i = 1; i < ThresholdImg.rows - 1; i++)
	{
		for (size_t j = 1; j < ThresholdImg.cols - 1; j++)
		{
			double N0 = ThresholdImg.at<uchar>(i, j + 1);
			double N1 = ThresholdImg.at<uchar>(i - 1, j + 1);
			double N2 = ThresholdImg.at<uchar>(i - 1, j);
			double N3 = ThresholdImg.at<uchar>(i - 1, j - 1);
			double N4 = ThresholdImg.at<uchar>(i, j - 1);
			double N5 = ThresholdImg.at<uchar>(i + 1, j - 1);
			double N6 = ThresholdImg.at<uchar>(i + 1, j);
			double N7 = ThresholdImg.at<uchar>(i + 1, j + 1);
			int cnt = 0;
			if (ThresholdImg.at<uchar>(i, j) == 255)   //中心点为白点
			{
				if (N0 < 255) cnt++;
				if (N2 < 255) cnt++;
				if (N4 < 255) cnt++;
				if (N6 < 255) cnt++;
				if (cnt >= 3)
					resuktImg.at<uchar>(i, j) = 0;
				else
					resuktImg.at<uchar>(i, j) = 255;
			}
			else                                 //中心点为黑点
			{
				if (((N2 < 255 || N3 < 255 || N4 < 255) && (N0 < 255 || N6 < 255 || N7 < 255)) ||
					((N0 < 255 || N1 < 255 || N2 < 255) && (N4 == 0 || N5 < 255 || N6 < 255)))
					resuktImg.at<uchar>(i, j) = 0;
				else
					resuktImg.at<uchar>(i, j) = 255;

			}
			
		}
	}

	return resuktImg;

}

猜你喜欢

转载自blog.csdn.net/sinat_36412790/article/details/80283457