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;
}