基于c++的中值滤波代码实现

//冒泡排序
//也可以用c++自带的sort()函数进行排序
void bubble_sort(vector<uchar>& arr)
{
	for (int i = 0; i < arr.size()- 1; i++)
	{
		for (int j = 0; j < arr.size() - i - 1; j++)
		{
			if (arr[j] > arr[j+1])
			{
				swap(arr[j], arr[j+1]);
			}
		}
	}
}
void medianblur(const Mat& src, Mat& dst, Size wsize)
{
	if (wsize.width % 2 == 0 || wsize.height % 2 == 0) {
		cout << "Please enter odd size!" << endl;
		exit(-1);
	}
	int hh = (wsize.height - 1) / 2;
	int hw = (wsize.width - 1) / 2;
	Mat Newsrc;
	copyMakeBorder(src, Newsrc, hw, hw, hh, hh, BORDER_DEFAULT);//以边缘为轴,对称

	//中值滤波
	if (src.channels() == 1)
	{
		for (int i = hh; i < src.rows + hh; ++i) {
			uchar* ptrdst = dst.ptr<uchar>(i - hh);
			for (int j = hw; j < src.cols + hw; ++j) {
				std::vector<uchar> pix;
				for (int r = i - hh; r <= i + hh; ++r) {
					const uchar* ptrsrc = Newsrc.ptr<uchar>(r);
					for (int c = j - hw; c <= j + hw; ++c) {
						pix.push_back(ptrsrc[c]);
					}
				}
				bubble_sort(pix);//冒泡排序
				ptrdst[j - hw] = pix[(wsize.area() - 1) / 2];//将中值映射到输出图像
			}
		}
	}
	if (src.channels() == 3)
	{
		for (int i = hh; i < src.rows + hh; ++i) {
			for (int j = hw; j < src.cols + hw; ++j) {
				vector<vector<uchar>> pix(3);
				
				for (int r = i - hh; r <= i + hh; ++r) {
					for (int c = j - hw; c <= j + hw; ++c) {
						pix[0].push_back(Newsrc.at<Vec3b>(r,c)[0]);
						pix[1].push_back(Newsrc.at<Vec3b>(r,c)[1]);
						pix[2].push_back(Newsrc.at<Vec3b>(r,c)[2]);
					}
				}
				//冒泡排序
				bubble_sort(pix[0]);
				bubble_sort(pix[1]);
				bubble_sort(pix[2]);
				//将中值映射到输出图像
				dst.at<Vec3b>(i-hh,j-hw)[0] = pix[0][(wsize.area() -1) / 2];
				dst.at<Vec3b>(i-hh,j-hw)[1] = pix[1][(wsize.area() - 1) / 2];
				dst.at<Vec3b>(i-hh,j-hw)[2] = pix[2][(wsize.area() - 1) / 2];
			}
		}
	}
}

发布了6 篇原创文章 · 获赞 0 · 访问量 507

猜你喜欢

转载自blog.csdn.net/qq_43702097/article/details/103918962