1. 程式人生 > >【影象處理】影象濾波去噪聲——均值濾波、中值濾波、對稱均值濾波 低通濾波 高通濾波(opencv)

【影象處理】影象濾波去噪聲——均值濾波、中值濾波、對稱均值濾波 低通濾波 高通濾波(opencv)

①觀察灰度分佈來描述一幅影象成為空間域,觀察影象變化的頻率被成為頻域。 
②頻域分析:低頻對應區域的影象強度變化緩慢,高頻對應的變化快。低通濾波器去除了影象的高頻部分,高通濾波器去除了影象的低頻部分。

(1)低通濾波 
①栗子:

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
int main()
{
    // Read input image
cv::Mat image= cv::imread("boldt.jpg",0); if (!image.data) return 0; // Display the image cv::namedWindow("Original Image"); cv::imshow("Original Image",image); // Blur the image with a mean filter cv::Mat result; cv::blur(image,result,cv::Size(5,5)); // Display the blurred image
cv::namedWindow("Mean filtered Image"); cv::imshow("Mean filtered Image",result);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

結果:每個畫素變為相鄰畫素的平均值, 快速的強度變化轉化為平緩的過度 
這裡寫圖片描述
②栗子:近的畫素新增更多的權重。:高斯濾波器

cv::GaussianBlur(image,result,cv::Size(5,5),1.5);
  • 1

這裡寫圖片描述

(2)中值濾波 :非線性濾波 
有效去除椒鹽噪點

cv::medianBlur(image,result,5);
  • 1

這裡寫圖片描述

(3)方向濾波(Sobel) 
強調影象中的高頻分量,使用高通濾波器進行邊緣檢測。 
Sobel運算元是一種經典的邊緣檢測線性濾波器,可被認為是影象在垂直和水平方向變化的測量。

#include <iostream>
#include <iomanip>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "laplacianZC.h"

int main()
{
     //Read input image
    cv::Mat image= cv::imread("boldt.jpg",0);
    if (!image.data)
        return 0; 

    // Display the image
    cv::namedWindow("Original Image");
    cv::imshow("Original Image",image);

    // Compute Sobel X derivative
    cv::Mat sobelX;
    cv::Sobel(image,sobelX,CV_8U,1,0,3,0.4,128);

    // Display the image
    cv::namedWindow("Sobel X Image");
    cv::imshow("Sobel X Image",sobelX);

    // Compute Sobel Y derivative
    cv::Mat sobelY;
    cv::Sobel(image,sobelY,CV_8U,0,1,3,0.4,128);

    // Display the image
    cv::namedWindow("Sobel Y Image");
    cv::imshow("Sobel Y Image",sobelY);

    // Compute norm of Sobel     得到sobel的摸
    cv::Sobel(image,sobelX,CV_16S,1,0);
    cv::Sobel(image,sobelY,CV_16S,0,1);
    cv::Mat sobel;
    //compute the L1 norm
    sobel= abs(sobelX)+abs(sobelY);

    double sobmin, sobmax;
    cv::minMaxLoc(sobel,&sobmin,&sobmax);
    std::cout << "sobel value range: " << sobmin << "  " << sobmax << std::endl;

    // Print window pixel values
    for (int i=0; i<12; i++) {
        for (int j=0; j<12; j++)
            std::cout << std::setw(5) << static_cast<int>(sobel.at<short>(i+135,j+362)) << " ";
        std::cout << std::endl;
    }
    std::cout << std::endl;
    std::cout << std::endl;
    std::cout << std::endl;

    // Conversion to 8-bit image
    // sobelImage = -alpha*sobel + 255
    cv::Mat sobelImage;
    sobel.convertTo(sobelImage,CV_8U,-255./sobmax,255);

    // Display the image
    cv::namedWindow("Sobel Image");
    cv::imshow("Sobel Image",sobelImage);

    // Apply threshold to Sobel norm (low threshold value)
    cv::Mat sobelThresholded;
    cv::threshold(sobelImage, sobelThresholded, 225, 255, cv::THRESH_BINARY);

    // Display the image
    cv::namedWindow("Binary Sobel Image (low)");
    cv::imshow("Binary Sobel Image (low)",sobelThresholded);

    // Apply threshold to Sobel norm (high threshold value)
    cv::threshold(sobelImage, sobelThresholded, 190, 255, cv::THRESH_BINARY);

    // Display the image
    cv::namedWindow("Binary Sobel Image (high)");
    cv::imshow("Binary Sobel Image (high)",sobelThresholded);
  • 結果: 

這裡寫圖片描述
(4)影象的拉普拉斯變換 
是一種基於影象導數的高通線性濾波器,計算二階倒數已衡量影象的彎曲度。

// Compute Laplacian 3x3
    cv::Mat image = cv::imread("boldt.jpg", 0);
    cv::Mat laplace;
    cv::Laplacian(image,laplace,CV_8U,1,1,128);

    // Display the image
    cv::namedWindow("Laplacian Image");
    cv::imshow("Laplacian Image",laplace);

    // Print window pixel values
    for (int i=0; i<12; i++) {
        for (int j=0; j<12; j++)
            std::cout << std::setw(5) << static_cast<int>(laplace.at<uchar>(i+135,j+362))-128 << " ";
        std::cout << std::endl;
    }
    std::cout << std::endl;
    std::cout << std::endl;
    std::cout << std::endl;

    // Compute Laplacian 7x7
    cv::Laplacian(image,laplace,CV_8U,7,0.01,128);

    // Display the image 
    cv::namedWindow("Laplacian Image");
    cv::imshow("Laplacian Image",laplace);

    // Print window pixel values
    for (int i=0; i<12; i++) {
        for (int j=0; j<12; j++)
            std::cout << std::setw(5) << static_cast<int>(laplace.at<uchar>(i+135,j+362))-128 << " ";
        std::cout << std::endl;
    }

    // Extract small window
    cv::Mat window(image,cv::Rect(362,135,12,12));
    cv::namedWindow("Image window");
    cv::imshow("Image window",window);
    cv::imwrite("window.bmp",window);

    // Compute Laplacian using LaplacianZC class
    LaplacianZC laplacian;
    laplacian.setAperture(7);
    cv::Mat flap= laplacian.computeLaplacian(image);
    double lapmin, lapmax;
    cv::minMaxLoc(flap,&lapmin,&lapmax);
    std::cout << "Laplacian value range=[" << lapmin << "," << lapmax << "]\n";
    laplace= laplacian.getLaplacianImage();
    cv::namedWindow("Laplacian Image (7x7)");
    cv::imshow("Laplacian Image (7x7)",laplace);

    // Print Laplacian values
    std::cout << std::endl;
    for (int i=0; i<12; i++) {
        for (int j=0; j<12; j++)
            std::cout << std::setw(5) << static_cast<int>(flap.at<float>(i+135,j+362)/100) << " ";
        std::cout << std::endl;
    }
    std::cout << std::endl;

    // Compute and display the zero-crossing points
    cv::Mat zeros;
    zeros= laplacian.getZeroCrossings(lapmax);
    cv::namedWindow("Zero-crossings");
    cv::imshow("Zero-crossings",zeros);

    // Compute and display the zero-crossing points (Sobel version)
    zeros= laplacian.getZeroCrossings();
    zeros= laplacian.getZeroCrossingsWithSobel(50);
    cv::namedWindow("Zero-crossings (2)");
    cv::imshow("Zero-crossings (2)",zeros);

    // Print window pixel values
    for (int i=0; i<12; i++) {
        for (int j=0; j<12; j++)
            std::cout << std::setw(2) << static_cast<int>(zeros.at<uchar>(i+135,j+362)) << " ";
        std::cout << std::endl;
    }

    // Display the image with window
    cv::rectangle(image,cv::Point(362,135),cv::Point(374,147),cv::Scalar(255,255,255));
    cv::namedWindow("Original Image with window");
    cv::imshow("Original Image with window",image);

    cv::waitKey();
    return 0;
}

相關推薦

影象處理影象濾波噪聲——均值濾波濾波對稱均值濾波 濾波 濾波opencv

①觀察灰度分佈來描述一幅影象成為空間域,觀察影象變化的頻率被成為頻域。  ②頻域分析:低頻對應區域的影象強度變化緩慢,高頻對應的變化快。低通濾波器去除了影象的高頻部分,高通濾波器去除了影象的低頻部分。 (1)低通濾波  ①栗子: #include <iostream> #include &l

python影象處理影象濾波ImageFilter類詳解

在影象處理中,經常需要對影象進行平滑、銳化、邊界增強等濾波處理。在使用PIL影象處理庫時,我們通過Image類中的成員函式filter()來呼叫濾波函式對影象進行濾波,而濾波函式則通過ImageFil

影象處理影象強度變換直方圖均衡化Image Intensity Transformations and Histogram Equalization

實驗要求   該實驗使用強度變換方法對影象進行增強。實驗影象為圖3.8(a)   (1.a) 用公式(3.2-2)所示的對數變換方法進行影象增強。   (1.b) 用公式(3.2-3)形式的指數變換方法進行影象增強。實驗的目的是用(1.a)和(1.b)中的

python影象處理影象的縮放旋轉與翻轉

影象的幾何變換,如縮放、旋轉和翻轉等,在影象處理中扮演著重要的角色,python中的Image類分別提供了這些操作的介面函式,下面進行逐一介紹。 1、影象的縮放 影象的縮放使用resize()成員函

OpenCV3影象處理影象載入顯示儲存

一、影象載入 Mat cv::imread( const String & filename, int flags = IMREAD_COLOR ) 引數一:圖片所在的

python影象處理影象的讀取顯示與儲存

python作為機器學習和影象處理的利器,收到越來越多的推崇,特別是在影象處理領域,越來越多的研究和開發開始轉向使用python語言,下面就介紹python影象處理中最基本的操作,即影象的讀取顯示與儲

影象處理影象畫素隨機化:雪花漫天飛

近來經常和心理系做實驗,總是有各種“什麼什麼隨機化,刺激的物理性質保持一樣。。”的需求。之前做《去掩蔽》的實驗時,有一套圖片就是做的畫素隨機化,這是最簡單的隨機化了。當時影象只有兩種畫素,灰的和深灰的,而且深灰的比較少。於是我就統計了深灰畫素點的個數,然後在一張同樣大的灰色圖

數字影象處理影象邊緣銳化之微分運算

影象邊緣銳化處理的目的 突出影象的細節,或者增強被模糊的細節,增強影象邊緣,便於提取目標物體的邊界,對影象進行分割、目標區域識別、區域形狀提取等為影象理解和分析打下基礎。   影象邊緣銳化的基本方法 微分運算 梯度銳化 邊緣檢測   影象邊緣型別 通常,邊緣上的灰

數字影象處理影象的面積與周長計算

  二值化影象區域標記 在二值化影象中,相互聯結的黑畫素集合成為一個(黑)區域,通過對影象內每個區域進行標記操作,求得區域的數目。處理前的f是二值的,畫素要麼為0(黑),要麼為255(白)處理後每個畫素的值即為其所處理區域的標號(1,2,3,。。。) 標記規則1.初始化標記為0,從左到右,從上

opencv for python (13) 影象卷積及影象平滑平均斯模糊模糊雙邊濾波

影象卷積 卷積函式 cv2.filter2D(img,-1,kernel) 第一個引數是原影象 第二個引數目標影象的所需深度。如果是負數,則與原影象深度相同 第三個引數是卷積核心 import cv2 import numpy as np

數字影象處理線性濾波最大濾波,最小濾波濾波高頻補償濾波vs2017+openCV

一、實驗原理 1、線性濾波 ① 不管是低通線性濾波還是高通線性濾波原理都是一樣的,用圖一所示的濾波器模板進行加權處理,將最終得到的R值賦給w5對應的畫素。 ②低通線性濾波和高通線性濾波不同之處就在於: 低通線性濾波w1+w2+…+w9 = 1,且w1~w9全

影象處理影象模糊 總結

本人最近由於做相關去卷積工作,查閱了上百篇文獻,發現在這個領域,可能也是‘水太深’了,並沒有一篇較好的綜述,現在做以下總結---- 只對高斯與散焦模糊的非盲去卷積領域,對於運動模糊並未做總結,但實際上除了點擴散函式的估計有區別,實際上這三類去模糊甚至和去噪,損失函式模型都可

影象處理高效的濾波(bug 已修復

之前的bug: 當灰度為255或者0時,出現灰度溢位的bug,導致灰度黑白顛倒,現已修復,並重新將函式改為無返回值型別,原有的帶有返回影象的函式不規範,容易忘記釋放空間。新的函式再最後面 經測試,我的程式計算速度比OpenCV耗時多多了,,,~~(>

OpenCV影象處理十五影象空域濾波

1.空域濾波介紹 空域濾波是一種鄰域處理方法,通過直接在影象空間中對鄰域內畫素進行處理,達到平滑或銳化影象的作用。此外,在影象識別中,通過濾波還可以抽出影象的特徵作為影象識別的特徵模式。 空域濾波是影象處理領域中廣泛使用的主要工具。空域濾波主要可以分為線性濾波和非線性濾波,

影象處理模糊影象模糊之初探--Single Image Motion Deblurring

原文:原文地址 曾經很長一段時間, 對影象去模糊都有一種偏見, 認為這是一個灌水的領域, 沒有什麼實用價值,要到這樣的文章,不管是多高的檔次, 直接pass。 最近在調研最近幾年的關於Computational Photography的一些研究熱點時, 發現影象去模糊這

影象處理 增加程式速度的方法

1. stack(棧) heap(堆) 和全域性區 測試BGR轉YUV  的表在stack 和 heap  2. 查詢表   部分查詢表  和3D查詢表  速度比較   3. 查詢表放在堆上和棧上的速度比較   4.

影象處理工業相機原理詳述 轉載

轉自:  https://blog.csdn.net/HelloZEX/article/details/80905095 工業相機是機器視覺系統中的一個關鍵元件,其最本質的功能就是將光訊號轉變成有序的電訊號。選擇合適的相機也是機器視覺系統設計中的重要環節,相機的選擇不僅直接決定所採集到的影象

影象處理Lightroom Classic CC 2019 for Mac中文破解版

Lightroom Classic CC 2019 for Mac中文破解版是目前最強大的影象處理軟體之一,簡稱Lr CC 2019破解版,使用lightroom mac 破解版可以讓您獲得最佳的攝影效果所提供的圖片整理編輯工具,提高照片的色彩、刪除瑕疵、伸展畫面等等,可以為您的照片錦上添花。新版L

imgproc 模組. 影象處理形態學變化

一、更多的形態學變化     包括開運算 (Opening)、閉運算 (Closing)、形態梯度 (Morphological Gradient)、頂帽 (Top Hat)、黑帽(Black Hat)。具體可參考《數字影象處理 第三版》(岡薩雷斯)——第九章 形態學影象處理。注:具體原

RAW影象處理DxO PhotoLab for Mac破解版

DxO PhotoLab for Mac是一款專業的RAW影象處理軟體,可以讓使用者以最佳影象質量輕鬆生成RAW和JPEG影象,並且DxO PhotoLab Mac版還為使用者提供了一整套智慧輔助校正,讓您可以隨時手動進行微調,有需要的朋友快來看看吧! 下載地址DxO PhotoLab for