利用openCV实现中值滤波自定义滤波窗口尺寸的功能(类似halcon中的median_rect函数功能)

在halcon图像库中有一个常用的中值滤波算子median_rect:
median_rect(Image : ImageMedian : MaskWidth, MaskHeight : )
其中Image为输入图像,ImageMedian为输出图像,MaskWidth为滤波窗口的宽度,MaskHieght为滤波窗口的高度。
openCV中自带了中值滤波的函数medianBlur:
C++: void medianBlur(InputArray src, OutputArray dst, int ksize)
其中src为输入图像,dst为输出图像,ksize为滤波窗口的大小。
halcon中的中值滤波算子相对于openCV中的中值滤波算子,在滤波窗口上有所不同。在halcon中可以分别定义滤波窗口的宽度与高度,生成一个MaskWidthMaskHeight 大小的滤波窗口,然后openCV中只能定义正方形的尺寸为ksizeksize的滤波窗口,无法分别定义宽度和高度,所以相比halcon中的median_rect算子灵活性不高。
在一个具体的项目中,根据实际情况,需要对图像进行中值滤波,当设定滤波窗口宽度为1,高度为11时效果最佳。然后在利用openCV进行实现时,现有的中值滤波函数medianBlur无法满足要求,因此仿照halcon中的滤波函数进行了编写,其中排序采用的是希尔排序法。由于要处理的图像尺寸不大,且时间要求不高,所以对于编写的程序没做过多速度方面的优化。下面贴出具体的代码。

int medianValue(int arr[], int len)
{//希尔排序法int N = len;for (int gap = N / 2; gap > 0; gap /= 2){for (int i = gap; i < N; i++){int inserted = arr[i];int j;for (j = i - gap; j >= 0 && inserted < arr[j]; j -= gap){arr[j + gap] = arr[j];}arr[j + gap] = inserted;}}return (N / 2.0) >(N / 2) ? arr[N / 2] : (arr[N / 2 - 1] + arr[N / 2]) / 2;
}void mediaImage(Mat srcImage, Mat &outImage,int kernel_w,int kernel_h)
{kernel_w = kernel_w % 2 == 0 ? kernel_w + 1 : kernel_w;//滤波窗口边长需要为奇数kernel_h = kernel_h % 2 == 0 ? kernel_h + 1 : kernel_h;outImage.create(srcImage.size(), srcImage.type());Mat borderImage;copyMakeBorder(srcImage, borderImage, kernel_h / 2, kernel_h / 2, kernel_w / 2, kernel_w / 2, BORDER_DEFAULT);//添加边缘uchar* p = NULL;uchar* output = NULL;int *value = new int[kernel_w*kernel_h];for (int j = 0; j <= borderImage.rows - kernel_h; j++)//处理行{output = outImage.ptr<uchar>(j);for (int i = 0; i < borderImage.cols - kernel_w / 2; i++)//处理列{for (int ptr_i = 0; ptr_i < kernel_h; ptr_i++){p = borderImage.ptr<uchar>(j + ptr_i);for (int row_i = 0; row_i < kernel_w; row_i++){value[ptr_i*kernel_w + row_i] = (int)p[i + row_i];//将滤波窗口中的数据添加到数组中}}*output++ = medianValue(value, kernel_w*kernel_h);//进行}}p = NULL;delete p;output = NULL;delete output;
}

对编写的这段代码进行了测试,选择一张图像,分别利用这段代码和halcon中的median_rect算子进行处理,滤波窗口尺寸分别为(33),(44),(55),(16),(110),(101),(48),(84),两者处理结果完全相同。不过代码未经优化,在处理速度上要明显慢于halcon中的median_rect算子。下一步考虑在滤波过程中对数组中添加数据以及排序部分进行优化。

水平有限,难免有错误和不足之处,恳请批评指正

利用openCV实现中值滤波自定义滤波窗口尺寸的功能(类似halcon中的median_rect函数功能)相关推荐

  1. OpenCV函数简记_第三章数字图像的滤波处理(方框,均值,高斯,中值和双边滤波)

    系列文章目录 OpenCV函数简记_第一章数字图像的基本概念(邻域,连通,色彩空间) OpenCV函数简记_第二章数字图像的基本操作(图像读写,图像像素获取,图像ROI获取,图像混合,图形绘制) Op ...

  2. CV10 图像模糊(均值、高斯、中值、双边滤波)

    通过将图像与低通滤波器内核进行2D卷积来实现图像模糊.这对于消除噪音很有用.它实际上从图像中消除了高频部分(例如噪声,边缘).因此,在此操作中边缘有些模糊.(有一些模糊技术也可以不模糊边缘).Open ...

  3. matlab mean 滤波,中值和均值滤波---matlab实现(Median and mean filter ---matlab implementation).doc...

    中值和均值滤波---matlab实现(Median and mean filter ---matlab implementation) 中值和均值滤波---matlab实现(Median and me ...

  4. 【OpenCV】邻域滤波:方框、高斯、中值、双边滤波

    邻域滤波(卷积) 邻域算子值利用给定像素周围像素的值决定此像素的最终输出.如图左边图像与中间图像卷积禅城右边图像.目标图像中绿色的像素由原图像中蓝色标记的像素计算得到. 通用线性邻域滤波是一种常用的邻 ...

  5. 9、opencv 方盒、均值、高斯、中值、双边滤波 2022-08-22

    import cv2 import numpy as npimg_path = "./R-C.jpg"img = cv2.imread(img_path) 方盒滤波 # norma ...

  6. 域滤波:方框、高斯、中值、双边滤波

    邻域滤波(卷积) 邻域算子值利用给定像素周围像素的值决定此像素的最终输出.如图左边图像与中间图像卷积禅城右边图像.目标图像中绿色的像素由原图像中蓝色标记的像素计算得到. 通用线性邻域滤波是一种常用的邻 ...

  7. OpenCV笔记(1)(图片读取与现实、色彩空间、基础运算、均值方差、逻辑运算、泛洪填充、均值中值及自定义平滑)...

    一.图片读取和显示 import cv2 as cv# 图片读取cv.imread(img_path) car_img = cv.imread("car1.png") # 图片显示 ...

  8. 滤波算法、中值和均值滤波区别

    滤波算法:  这里所讲的算法都是针对图像空间的滤波算法,其中模板,可以理解为图像形态学中的结构元素,是用来选取图像中的那些像素点被用来操作的.空间滤波根据其功能划分为平滑滤波和锐化滤波.平滑滤波:能减 ...

  9. php中如何写js代码提示_PHP 如何编写类似js中alert() 提示框

    这篇文章主要介绍了PHP 实现类似js中alert() 提示框功能,非常的实用,这里推荐给大家,有需要的小伙伴来参考下,希望大家能喜欢. 主要应用于添加判断提示,跳转,返回,刷新. 代码如下:/** ...

最新文章

  1. java pkcs1转pkcs8_.NET Core RSA密钥的xml、pkcs1、pkcs8格式转换和JavaScript、Java等语言进行对接...
  2. 为什么下拉框拉不下来_太气人了!《除暴》吴彦祖的浴巾为什么就是掉不下来?...
  3. 20 Excellent AJAX Effects You Should Know
  4. 新高考改革选计算机专业要学什么,2020高考改革后考生如何选科与选专业?
  5. TokenInsight:反映区块链行业整体表现的TI指数较昨日同期下跌1.97%
  6. qt撤销与回退_Git撤销某次分支的合并Merge
  7. shell脚本只运行一个实例
  8. 网络安全实验1——口令攻击和钓鱼攻击
  9. java集合练习题_「集合练习题」Java集合框架篇-58-集合框架的几个练习题 - seo实验室...
  10. 300万高清车牌识别一体机Http推送
  11. 用ajax来上传图片,使用AJAX上传图片
  12. 重邮计算机学院艺术团,毕业季 | 重庆邮电大学2019届 “邮梦青春,毕业季”文艺晚会...
  13. 浅析ERP系统--人资
  14. vue 使用three.js 实现3D渲染
  15. C语言二位十进制计算器模数,十进制转二进制计算器
  16. 用手机怎么连接服务器?如何用手机远程连接服务器?
  17. Go语言中Printf和Println的区别
  18. 16 个动态图:一款好用到爆的 Python 可视化利器
  19. android root权限破解分析
  20. 如何使用Windows Defender扫描映射的网络驱动器

热门文章

  1. WampServer3.2.0下载安装教程详解版
  2. 怎样用计算机求方程组,【教程】用计算器解方程(牛顿法)
  3. 编写注册表文件修改注册表项
  4. 进行数据分析时如何提高留存?
  5. 浙江大华前端一二三面经(2021届校招)
  6. JSP中四大作用域和九大内置对象
  7. numpy的内存映射
  8. 什么是交互设计?(附视频教程)
  9. 有道学报告 四六级通过率城市排名出炉
  10. python爬取正能量图片mm131(update)