OpenCV原理实现(一)图像滤波操作

OpenCV原理实现(一)图像滤波操作

本文通过学习OpenCV的源码来实现算法原理。
opencv源码获取可参考
https://blog.csdn.net/chris_zhangrx/article/details/79090463
滤波原理是用一个固定大小的滤波器对整个图像进行卷积。
其主要原理可参考
https://blog.csdn.net/csdnforyou/article/details/82216301
在OpenCV滤波算法中,有两个非常重要的基本工具函数,copyMakeBorder和borderInterpolate
可参考
https://blog.csdn.net/qianqing13579/article/details/42323397

1.中值滤波medianBlur

中值滤波器

		static bool mediablur(cv::Mat &src/*输入*/, cv::Mat &dst/*输出*/, int radius/*尺寸大小 奇数*/)//中值滤波
	{
		if (radius % 2 == 0)
			return false;
		int kernelSize = radius / 2;//半径大小
		dst = src.clone();
		cv::Mat resizeSrc;
		cv::copyMakeBorder(src, resizeSrc, kernelSize, kernelSize, kernelSize, kernelSize, cv::BORDER_REPLICATE /*复刻类型*/);
		static int channels = src.channels();//判断通道数
		if (channels == 1)
		{
			medianFilter(resizeSrc, dst, kernelSize);
			return true;
		}
		else if (channels == 3)
		{
			cv::Mat srcMat[3];
			cv::Mat dstMat[3];
			cv::split(resizeSrc, srcMat);
			cv::split(dst, dstMat);
			for (int i = 0; i < 3; i++)
			{
				medianFilter(srcMat[i], dstMat[i], kernelSize);
			}
			cv::merge(dstMat, 3, dst);
			return true;
		}
		else
		{
			return false;
		}
	}
	static bool sortValues(int *values, int num)//排序
	{
		for (int i = 0; i < num; i++)
		{
			for (int j = i + 1; j < num; j++)
			{
				if (values[i] > values[j])
				{
					int temp = values[j];
					values[j] = values[i];
					values[i] = temp;
				}
			}
		}
		return true;
	}
	static int getMedianValue(int *values, int num)//得到中值
	{
		sortValues(values, num);
		return values[num / 2];
	}
	static bool medianFilter(cv::Mat &src, cv::Mat &dst, int kernelSize)//中值操作
	{
		int cols = dst.cols;
		int rows = dst.rows;
		for (int i = 0; i < rows; i++)
		{
			uchar *data = dst.ptr(i);//使用指针访问
			for (int j = 0; j < cols; j++)
			{
				int* values = new int[kernelSize * 4 + 4 * kernelSize*kernelSize + 1];
				int ker_num = 0;
				for (int m = -1 * kernelSize; m <= kernelSize; m++)
					for (int n = -1 * kernelSize; n <= kernelSize; n++)
					{
						values[ker_num] = src.ptr(i + kernelSize + m)[j + kernelSize + n];
						ker_num++;
					}
				dst.ptr(i)[j] = getMedianValue(values, ker_num);
				delete values;
			}
		}
		return true;
	}

耗时比较:
opencv算法=3.1662-----自己写的算法=301.956
原图:
OpenCV原理实现(一)图像滤波操作_第1张图片
处理后结果:
dst1为opencv的算法
dst2为自己写的算法
OpenCV原理实现(一)图像滤波操作_第2张图片

你可能感兴趣的:(opencv)