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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图像复原之维纳滤波

發(fā)布時(shí)間:2023/12/14 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图像复原之维纳滤波 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

基本原理

圖像復(fù)原是圖像處理的重要組成部分,由于圖像在獲取和傳輸過程中通常不可避免的要受到一些噪聲的干擾,因此在進(jìn)行其他圖像處理以及圖像分析之前,應(yīng)該盡量將圖像復(fù)原到其原始真實(shí)狀態(tài)。圖像復(fù)原的關(guān)鍵問題是在于建立退化模型。圖像退化模型如下:

維納濾波器是一種自適應(yīng)最小均方誤差濾波器,它最終的目的是使得復(fù)原圖像和原始圖像的均方誤差最小。省去推導(dǎo)過程,給出頻率的維納濾波公式

示例演示

在下面例子中,我們對(duì)退化函數(shù)進(jìn)行了簡化,將退化函數(shù)置為1,因此維納濾波公式簡化為:

#include <opencv2\opencv.hpp> #include <iostream>using namespace std; using namespace cv;Mat GetSpectrum(const Mat &src) {Mat dst, cpx;Mat planes[] = { Mat_<float>(src), Mat::zeros(src.size(), CV_32F) };merge(planes, 2, cpx);dft(cpx, cpx);split(cpx, planes);magnitude(planes[0], planes[1], dst);//頻譜就是頻域幅度圖的平方multiply(dst, dst, dst);return dst; }Mat WienerFilter(const Mat &src, const Mat &ref, int stddev) {//這些圖片是過程中會(huì)用到的,pad是原圖像0填充后的圖像,cpx是雙通道頻域圖,mag是頻域幅值圖,dst是濾波后的圖像Mat pad, cpx, dst;//獲取傅里葉變化最佳圖片尺寸,為2的指數(shù)int m = getOptimalDFTSize(src.rows);int n = getOptimalDFTSize(src.cols);//對(duì)原始圖片用0進(jìn)行填充獲得最佳尺寸圖片copyMakeBorder(src, pad, 0, m - src.rows, 0, n - src.cols, BORDER_CONSTANT, Scalar::all(0));//獲得參考圖片頻譜Mat tmpR(pad.rows, pad.cols, CV_8U);resize(ref, tmpR, tmpR.size());Mat refSpectrum = GetSpectrum(tmpR);//獲得噪聲頻譜Mat tmpN(pad.rows, pad.cols, CV_32F);randn(tmpN, Scalar::all(0), Scalar::all(stddev));Mat noiseSpectrum = GetSpectrum(tmpN);//對(duì)src進(jìn)行傅里葉變換Mat planes[] = { Mat_<float>(pad), Mat::zeros(pad.size(), CV_32F) };merge(planes, 2, cpx);dft(cpx, cpx);split(cpx, planes);//維納濾波因子Mat factor = refSpectrum / (refSpectrum + noiseSpectrum);multiply(planes[0], factor, planes[0]);multiply(planes[1], factor, planes[1]);//重新合并實(shí)部planes[0]和虛部planes[1]merge(planes, 2, cpx);//進(jìn)行反傅里葉變換idft(cpx, dst, DFT_SCALE | DFT_REAL_OUTPUT);dst.convertTo(dst, CV_8UC1);return dst; }int main(int argc, char** argv) {char *imgName = "D:\\TestData\\lena.jpg";Mat inputImg;inputImg = imread(imgName, 0);if (!inputImg.data){cout << "No image data" << endl;return -1;}imshow("OriginImage", inputImg);cv::Mat noise(inputImg.size(), inputImg.type());float m = (10);float sigma = (50);cv::randn(noise, m, sigma); //mean and varianceMat noiseImg =inputImg + noise;imshow("NoiseImage", noiseImg);Mat resultImg = WienerFilter(noiseImg, inputImg, 50);imwrite("./result.jpg", resultImg);imshow("ResultImage", resultImg);waitKey(0);return 0; }

運(yùn)行結(jié)果

參考資料

總結(jié)

以上是生活随笔為你收集整理的图像复原之维纳滤波的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。