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<uchar>(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<uchar>(i + kernelSize + m)[j + kernelSize + n];
						ker_num++;
					}
				dst.ptr<uchar>(i)[j] = getMedianValue(values, ker_num);
				delete values;
			}
		}
		return true;
	}

耗時比較:
opencv算法=3.1662-----自己寫的算法=301.956
原圖:
在這裏插入圖片描述
處理後結果:
dst1爲opencv的算法
dst2爲自己寫的算法
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章