利用openCV实现中值滤波自定义滤波窗口尺寸的功能(类似halcon中的median_rect函数功能)
利用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函数功能)相关推荐
- OpenCV函数简记_第三章数字图像的滤波处理(方框,均值,高斯,中值和双边滤波)
系列文章目录 OpenCV函数简记_第一章数字图像的基本概念(邻域,连通,色彩空间) OpenCV函数简记_第二章数字图像的基本操作(图像读写,图像像素获取,图像ROI获取,图像混合,图形绘制) Op ...
- CV10 图像模糊(均值、高斯、中值、双边滤波)
通过将图像与低通滤波器内核进行2D卷积来实现图像模糊.这对于消除噪音很有用.它实际上从图像中消除了高频部分(例如噪声,边缘).因此,在此操作中边缘有些模糊.(有一些模糊技术也可以不模糊边缘).Open ...
- matlab mean 滤波,中值和均值滤波---matlab实现(Median and mean filter ---matlab implementation).doc...
中值和均值滤波---matlab实现(Median and mean filter ---matlab implementation) 中值和均值滤波---matlab实现(Median and me ...
- 【OpenCV】邻域滤波:方框、高斯、中值、双边滤波
邻域滤波(卷积) 邻域算子值利用给定像素周围像素的值决定此像素的最终输出.如图左边图像与中间图像卷积禅城右边图像.目标图像中绿色的像素由原图像中蓝色标记的像素计算得到. 通用线性邻域滤波是一种常用的邻 ...
- 9、opencv 方盒、均值、高斯、中值、双边滤波 2022-08-22
import cv2 import numpy as npimg_path = "./R-C.jpg"img = cv2.imread(img_path) 方盒滤波 # norma ...
- 域滤波:方框、高斯、中值、双边滤波
邻域滤波(卷积) 邻域算子值利用给定像素周围像素的值决定此像素的最终输出.如图左边图像与中间图像卷积禅城右边图像.目标图像中绿色的像素由原图像中蓝色标记的像素计算得到. 通用线性邻域滤波是一种常用的邻 ...
- OpenCV笔记(1)(图片读取与现实、色彩空间、基础运算、均值方差、逻辑运算、泛洪填充、均值中值及自定义平滑)...
一.图片读取和显示 import cv2 as cv# 图片读取cv.imread(img_path) car_img = cv.imread("car1.png") # 图片显示 ...
- 滤波算法、中值和均值滤波区别
滤波算法: 这里所讲的算法都是针对图像空间的滤波算法,其中模板,可以理解为图像形态学中的结构元素,是用来选取图像中的那些像素点被用来操作的.空间滤波根据其功能划分为平滑滤波和锐化滤波.平滑滤波:能减 ...
- php中如何写js代码提示_PHP 如何编写类似js中alert() 提示框
这篇文章主要介绍了PHP 实现类似js中alert() 提示框功能,非常的实用,这里推荐给大家,有需要的小伙伴来参考下,希望大家能喜欢. 主要应用于添加判断提示,跳转,返回,刷新. 代码如下:/** ...
最新文章
- java pkcs1转pkcs8_.NET Core RSA密钥的xml、pkcs1、pkcs8格式转换和JavaScript、Java等语言进行对接...
- 为什么下拉框拉不下来_太气人了!《除暴》吴彦祖的浴巾为什么就是掉不下来?...
- 20 Excellent AJAX Effects You Should Know
- 新高考改革选计算机专业要学什么,2020高考改革后考生如何选科与选专业?
- TokenInsight:反映区块链行业整体表现的TI指数较昨日同期下跌1.97%
- qt撤销与回退_Git撤销某次分支的合并Merge
- shell脚本只运行一个实例
- 网络安全实验1——口令攻击和钓鱼攻击
- java集合练习题_「集合练习题」Java集合框架篇-58-集合框架的几个练习题 - seo实验室...
- 300万高清车牌识别一体机Http推送
- 用ajax来上传图片,使用AJAX上传图片
- 重邮计算机学院艺术团,毕业季 | 重庆邮电大学2019届 “邮梦青春,毕业季”文艺晚会...
- 浅析ERP系统--人资
- vue 使用three.js 实现3D渲染
- C语言二位十进制计算器模数,十进制转二进制计算器
- 用手机怎么连接服务器?如何用手机远程连接服务器?
- Go语言中Printf和Println的区别
- 16 个动态图:一款好用到爆的 Python 可视化利器
- android root权限破解分析
- 如何使用Windows Defender扫描映射的网络驱动器