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爲自己寫的算法