日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

基于opencv,C++实现中值滤波器

發布時間:2023/12/14 c/c++ 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于opencv,C++实现中值滤波器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基于opencv,C++實現中值濾波器

目的:去除圖像的椒鹽噪聲
原理:它將每一像素點的灰度值設置為該點某鄰域窗口內的所有像素點灰度值的中值

偽代碼:
輸入:原圖像、目標圖像、核的半徑

(1).判斷原圖像是否為空,空則直接返回
(2).判斷核的半徑是否為奇數
(3).原圖像邊界填充,目標圖像清空
(4).中值濾波
①.新建一個半徑*半徑大小的二維數組
②.獲取核大小的原圖像的值,寫入數組
③.數組進行排序
④.將中值寫入目標圖像

源代碼

// ConsoleApplication1.cpp : 此文件包含 "main" 函數。程序執行將在此處開始并結束。 //#include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/highgui.hpp> #include <opencv2/core.hpp> #include <opencv2/imgproc.hpp> #include <vector> #include <algorithm>using namespace cv; using namespace std;// 冒泡排序 void Sort(int* a, int n) //把數組a遞增排序 {//for (int gap = n / 2; gap > 0; gap /= 2)//希爾排序// for (int i = gap; i < n; ++i)// for (int j = i - gap; j >= 0 && a[j] > a[j + gap]; j -= gap)// swap(a[j], a[j + gap]);for (int i = 0; i < n; i++) {for (int j = i + 1; j < n; j++){if (a[i] > a[j]) {int tmp = a[i];a[i] = a[j];a[j] = tmp;}}}}// 中值濾波 void MedianFilter(cv::Mat &srcImg, cv::Mat& dstImg, int ksize) {// 判斷原圖像是否為空if (srcImg.empty()) {return;}// 判斷核的大小是否為奇數CV_Assert(ksize % 2 == 1);// 獲取通道數int channels = srcImg.channels();// 清空目標圖像,對原圖像進行邊界填充Mat tmp;dstImg = dstImg.zeros(srcImg.size(), srcImg.type());int *kernel = new int[ksize*ksize];copyMakeBorder(srcImg, tmp, ksize / 2, ksize / 2, ksize / 2, ksize / 2, BORDER_REPLICATE);for (int i = ksize / 2; i < srcImg.rows + ksize / 2; i++) //對填充后的圖像從有圖像區域開始濾波{for (int j = ksize / 2; j < srcImg.cols + ksize / 2; j++){for (int c = 0; c < channels; c++){// 將核大小的圖像填入數組for (int m = 0; m < ksize*ksize; m++) {if (tmp.channels() == 1) {kernel[m] = tmp.ptr<uchar>(i - ksize / 2 + m / ksize, j - ksize / 2 + m % ksize)[c];}else if (tmp.channels() == 3) {kernel[m] = tmp.ptr<Vec3b>(i - ksize / 2 + m / ksize, j - ksize / 2 + m % ksize)->val[c];}else{delete[]kernel;return;}}// 排序 Sort(kernel, ksize*ksize);// 將中值寫入目標圖像if (tmp.channels() == 1) {dstImg.ptr<uchar>(i - ksize / 2, j - ksize / 2)[c] = kernel[(ksize*ksize) / 2];}else if (tmp.channels() == 3) {dstImg.ptr<Vec3b>(i - ksize / 2, j - ksize / 2)->val[c] = kernel[(ksize*ksize) / 2];}}}}delete[]kernel;}int main() {Mat image = imread("C:/Users/vmyf16/Desktop/1.jpg");if (image.empty()) {return -1;}Mat image2, image3;double t1 = (double)cv::getTickCount()/1000;MedianFilter(image, image2,3);t1 = (double)cv::getTickCount()/1000 - t1;std::cout << "自定義:" << t1 << std::endl;double t2 = (double)cv::getTickCount()/1000;medianBlur(image, image3, 3);t2 = (double)cv::getTickCount()/1000 - t2;std::cout << "opencv:" << t2 << std::endl;imshow("原圖", image);imshow("自定義中值濾波處理后", image2);imshow("openCV自帶的中值濾波", image3);waitKey(0);return 0; }

結果圖
原圖:
效果圖:

明顯看出:opencv的算法還是挺快的,自己寫的就當練練手。

總結

以上是生活随笔為你收集整理的基于opencv,C++实现中值滤波器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。