Mat twoThreshholdConnect(Mat img, int highThresh, int lowThresh)
{
Mat oriImage = img;
Mat maxImage = Mat(img.size(), CV_8UC1, Scalar(0));
Mat medImage = Mat(img.size(), CV_8UC1, Scalar(0));
Mat finalImage = Mat(img.size(), CV_8UC1, Scalar(0)); ;
int thisHighThresh = highThresh;
int thisLowThresh = lowThresh;
int width = oriImage.cols;
int hight = oriImage.rows;
//把高值给maxImage,中间值给medImage
for(int i = 0; i < width;i++)
for (int j = 0; j < hight; j++)
{
if (oriImage.at<uchar>(j, i) > thisHighThresh)
maxImage.at<uchar>(j, i) = oriImage.at<uchar>(j, i);
else if(oriImage.at<uchar>(j, i) > thisLowThresh)
medImage.at<uchar>(j, i) = oriImage.at<uchar>(j, i);
}
//中间值挑选靠近大值的像素保留(八领域内是否有大值)
for (int i = 1; i < width-1; i++)
for (int j = 1; j < hight-1; j++)
{
if (medImage.at<uchar>(j, i) != 0)
{
for(int k=i-1;k<i+2;k++)
for (int m = j - 1; m < j + 2; m++)
{
if (maxImage.at<uchar>(m, k) != 0)//8领域内有最大值
maxImage.at<uchar>(m, k) = medImage.at<uchar>(j, i);
}
}
}
//把保留下来的像素都设为255
for (int i = 1; i < width - 1; i++)
for (int j = 1; j < hight - 1; j++)
{
if (maxImage.at<uchar>(j, i) != 0)
finalImage.at<uchar>(j, i) = 255;
}
return finalImage;
}
C++自定义双域值处理
最新推荐文章于 2024-04-04 01:25:00 发布