//冒泡排序
//也可以用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];
}
}
}
}
基于c++的中值滤波代码实现
猜你喜欢
转载自blog.csdn.net/qq_43702097/article/details/103918962
今日推荐
周排行