欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python-opencv 中值濾波{cv2.medianBlur(src, ksize)}的用法

 更新時間:2021年06月05日 11:20:50   作者:A_Z666666  
這篇文章主要介紹了python-opencv 中值濾波{cv2.medianBlur(src, ksize)}的用法,具有很好的參考價值,希望對大家有所幫助。

python-opencv 中值濾波{cv2.medianBlur(src, ksize)}

中值濾波將圖像的每個像素用鄰域 (以當(dāng)前像素為中心的正方形區(qū)域)像素的 中值 代替 。與鄰域平均法類似,但計(jì)算的是中值

#用中值法
for y in xrange(1,myh-1):
    for x in xrange(1,myw-1):
        lbimg[y,x]=np.median(tmpimg[y-1:y+2,x-1:x+2]

下面調(diào)用opencv的函數(shù)

# -*- coding: utf-8 -*-   
#code:myhaspl@myhaspl.com
#中值濾波
import cv2
import numpy as np
fn="test3.jpg"
myimg=cv2.imread(fn)
img=cv2.cvtColor(myimg,cv2.COLOR_BGR2GRAY)
#加上椒鹽噪聲
#灰階范圍
w=img.shape[1]
h=img.shape[0]
newimg=np.array(img)
#噪聲點(diǎn)數(shù)量
noisecount=50000
for k in xrange(0,noisecount):
    xi=int(np.random.uniform(0,newimg.shape[1]))
    xj=int(np.random.uniform(0,newimg.shape[0]))
    newimg[xj,xi]=255
#濾波去噪
lbimg=cv2.medianBlur(newimg,3)
cv2.imshow('src',newimg)
cv2.imshow('dst',lbimg)
cv2.waitKey()
cv2.destroyAllWindows()       

中值濾波忽略了較高階灰度和較低階灰度,直接取中值,因此有效得過濾椒鹽噪聲。

這里寫圖片描述

對高斯噪聲的濾波

這里寫圖片描述

用scipy.signal中值濾波

中值濾波技術(shù)能有效抑制噪聲,通過把數(shù)字圖像中一點(diǎn)的值用該點(diǎn)周圍的各點(diǎn)值的中位數(shù)來代替,讓這些值接近,以消除原圖像中的噪聲。

*模擬中值濾波

>>> import random
>>> import numpy as np
>>> import scipy.signal as signal
>>> x=np.arange(0,100,10)
>>> random.shuffle(x)
>>> x
array([70, 80, 30, 20, 10, 90,  0, 60, 40, 50])
>>> signal.medfilt(x,3) #一維中值濾波
array([ 70.,  70.,  30.,  20.,  20.,  10.,  60.,  40.,  50.,  40.])

signal的medfilt()方法傳入兩個參數(shù),第一個參數(shù)是要作中值濾波的信號,第二個參數(shù)是鄰域的大小(奇數(shù))。如鄰域?yàn)?即是每個點(diǎn)自己和左右各一個點(diǎn)成為一個鄰域。在每個位置的鄰域中選取中位數(shù)替換這個位置的數(shù),也就是該函數(shù)的返回值數(shù)組。如果鄰域中出現(xiàn)沒有元素的位置,那么以0補(bǔ)齊。

>>> x=np.random.randint(1,1000,(4,4))
>>> x
array([[ 31,  33, 745, 483],
       [331, 469, 804, 479],
       [235, 487, 244, 982],
       [857, 114, 167, 174]])
>>> signal.medfilt(x,(3,3)) #二維中值濾波
array([[   0.,   33.,  469.,    0.],
       [  33.,  331.,  483.,  479.],
       [ 235.,  331.,  469.,  174.],
       [   0.,  167.,  167.,    0.]])

二維中值濾波還可以用signal.medfilt2d(),速度較快,但只支持int8,float32和float64。

*對圖像中值濾波 (這個代碼我還沒試,如果出現(xiàn)問題可以懷疑是代碼的問題)

import numpy as np
from PIL import Image
import scipy.signal as signal
im=Image.open('test.jpg') #讀入圖片并建立Image對象im
data=[] #存儲圖像中所有像素值的list(二維)
width,height=im.size #將圖片尺寸記錄下來
#讀取圖像像素的值
for h in range(height): #對每個行號h
    row=[] #記錄每一行像素
    for w in range(width): #對每行的每個像素列位置w
        value=im.getpixel((h,w)) #用getpixel讀取這一點(diǎn)像素值
        row.append(value)#把它加到這一行的list中去
    data.append(row) #把記錄好的每一行加到data的子list中去,就建立了模擬的二維list
data=signal.medfilt(data,kernel_size=3) #二維中值濾波
data=np.int32(data) #轉(zhuǎn)換為int類型,以使用快速二維濾波
#創(chuàng)建并保存結(jié)果
for h in range(height): #對每一行
    for w in range(width): #對該行的每一個列號
        im.putpixel((h,w),tuple(data[h][w])) #將data中該位置的值存進(jìn)圖像,要求參數(shù)為tuple
im.save('result.jpg')#存儲

opencv中值濾波medianBlur

中值濾波是一種典型的非線性濾波,是基于排序統(tǒng)計(jì)理論的一種能夠有效抑制噪聲的非線性信號處理技術(shù),基本思想是用像素點(diǎn)鄰域灰度值的中值來代替該像素點(diǎn)的灰度值,讓周圍的像素值接近真實(shí)的值從而消除孤立的噪聲點(diǎn)。該方法在取出脈沖噪聲、椒鹽噪聲的同時能保留圖像的邊緣細(xì)節(jié)。這些優(yōu)良特性是線性濾波所不具備的。

中值濾波首先也得生成一個濾波模板,將該模板內(nèi)的各像素值進(jìn)行排序,生成單調(diào)上升或單調(diào)下降的二維數(shù)據(jù)序列,二維中值濾波輸出為g(x, y)=medf{f(x-k, y-1),(k, l∈w)},其中f(x,y)和g(x,y)分別是原圖像和處理后圖像, w為輸入的二維模板,能夠在整幅圖像上滑動,通常尺寸為3*3或5*5區(qū)域,也可以是不同的形狀如線狀、圓形、十字形、圓環(huán)形等。通過從圖像中的二維模板取出奇數(shù)個數(shù)據(jù)進(jìn)行排序,用排序后的中值取代要處理的數(shù)據(jù)即可。

中值濾波對消除椒鹽噪聲非常有效,能夠克服線性濾波器帶來的圖像細(xì)節(jié)模糊等弊端,能夠有效保護(hù)圖像邊緣信息,是非常經(jīng)典的平滑噪聲處理方法。在光學(xué)測量條紋圖像的香味分析處理方法中有特殊作用,但在條紋中心分析方法中作用不大。

中值濾波相較于線性濾波中的均值濾波優(yōu)點(diǎn)在前面已經(jīng)提到,取得良好濾波效果的代價就是耗時的提升,可能達(dá)到均值濾波的數(shù)倍,而且對于細(xì)節(jié)較多的圖像也不太適用。

opencv中提供了medianBlur()函數(shù)實(shí)現(xiàn)了中值濾波操作,其原型如下:

C++: void medianBlur(InputArray src, OutputArray dst, int ksize)

參數(shù)解釋:

. InputArray src: 輸入圖像,圖像為1、3、4通道的圖像,當(dāng)模板尺寸為3或5時,圖像深度只能為CV_8U、CV_16U、CV_32F中的一個,如而對于較大孔徑尺寸的圖片,圖像深度只能是CV_8U。

. OutputArray dst: 輸出圖像,尺寸和類型與輸入圖像一致,可以使用Mat::Clone以原圖像為模板來初始化輸出圖像dst

. int ksize: 濾波模板的尺寸大小,必須是大于1的奇數(shù),如3、5、7……

示例程序:

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace std;
using namespace cv;
//定義全局變量
Mat g_mSrcImage;
Mat g_mDstImage;
const int g_nMedianBlurMaxValue = 5;
int g_nMedianBlurValue;
int g_nkernelSize;
//定義回調(diào)函數(shù)
void on_medianBlurTrackBar(int, void*);
int main()
{
    g_mSrcImage = imread("lena.jpg");
    //判斷文件是否加載成功
    if(g_mSrcImage.empty())
    {
        cout << "圖像加載失敗!" << endl;
        return -1;
    }
    else
        cout << "圖像加載成功!" << endl;
    //判斷圖像是否是CV_8U圖像
    if(0 <= g_mSrcImage.depth() <= 255)
        cout << "加載圖像符合處理要求!" << endl;
    else
    {
        cout << "圖像深度不是CV_8U,程序即將退出..." << endl;
        return -1;
    }
    namedWindow("原圖像", WINDOW_AUTOSIZE);
    imshow("原圖像", g_mSrcImage);
    //輸出圖像窗口屬性及軌跡條名稱
    namedWindow("中值濾波圖像", WINDOW_AUTOSIZE);
    char medianBlurName[20];
    sprintf(medianBlurName, "核函數(shù)尺寸 %d", g_nMedianBlurMaxValue);
    g_nMedianBlurValue = 1;
    //創(chuàng)建軌跡條
    createTrackbar(medianBlurName, "中值濾波圖像", &g_nMedianBlurValue,
                    g_nMedianBlurMaxValue, on_medianBlurTrackBar);
    on_medianBlurTrackBar(g_nMedianBlurValue, 0);
    waitKey(0);
    return 0;
}
void on_medianBlurTrackBar(int, void*)
{
    //重新計(jì)算尺寸值,尺寸值應(yīng)為大于1的奇數(shù)
    g_nkernelSize = g_nMedianBlurValue * 2 + 1;
    medianBlur(g_mSrcImage, g_mDstImage, g_nkernelSize);
    imshow("中值濾波圖像", g_mDstImage);
}

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

這里寫圖片描述

程序說明:

對于程序中對圖像深度的判斷根據(jù)如下標(biāo)準(zhǔn):

    CV_8U - 8-bit unsigned integers ( 0..255 )
    CV_8S - 8-bit signed integers ( -128..127 )
    CV_16U - 16-bit unsigned integers ( 0..65535 )
    CV_16S - 16-bit signed integers ( -32768..32767 )
    CV_32S - 32-bit signed integers ( -2147483648..2147483647 )
    CV_32F - 32-bit floating-point numbers ( -FLT_MAX..FLT_MAX, INF, NAN )
    CV_64F - 64-bit floating-point numbers ( -DBL_MAX..DBL_MAX, INF, NAN )

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python日期與時間戳的各種轉(zhuǎn)換示例

    python日期與時間戳的各種轉(zhuǎn)換示例

    這篇文章主要介紹了python日期與時間戳的各種轉(zhuǎn)換示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • python實(shí)現(xiàn)網(wǎng)頁鏈接提取的方法分享

    python實(shí)現(xiàn)網(wǎng)頁鏈接提取的方法分享

    這篇文章主要介紹了python實(shí)現(xiàn)的網(wǎng)頁鏈接提取的方法,需要的朋友可以參考下
    2014-02-02
  • Python搭建Gitee圖床的示例代碼

    Python搭建Gitee圖床的示例代碼

    在寫博客的過程中經(jīng)常要插入圖片,本文將使用Python實(shí)現(xiàn)對上傳的圖片自動壓縮,自動編碼,以及自動推送到遠(yuǎn)程倉庫,感興趣的可以了解一下
    2021-10-10
  • python獲取本地計(jì)算機(jī)名字的方法

    python獲取本地計(jì)算機(jī)名字的方法

    這篇文章主要介紹了python獲取本地計(jì)算機(jī)名字的方法,涉及Python獲取本地計(jì)算機(jī)信息的相關(guān)技巧,非常簡單實(shí)用,需要的朋友可以參考下
    2015-04-04
  • python 邊緣擴(kuò)充方式的實(shí)現(xiàn)示例

    python 邊緣擴(kuò)充方式的實(shí)現(xiàn)示例

    本文主要介紹了python 邊緣擴(kuò)充方式的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • python虛擬環(huán)境的安裝配置圖文教程

    python虛擬環(huán)境的安裝配置圖文教程

    下面小編就為大家?guī)硪黄猵ython虛擬環(huán)境的安裝配置圖文教程。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • pandas讀取csv文件,分隔符參數(shù)sep的實(shí)例

    pandas讀取csv文件,分隔符參數(shù)sep的實(shí)例

    今天小編就為大家分享一篇pandas讀取csv文件,分隔符參數(shù)sep的實(shí)例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python基礎(chǔ)教程之循環(huán)語句(for、while和嵌套循環(huán))

    Python基礎(chǔ)教程之循環(huán)語句(for、while和嵌套循環(huán))

    這篇文章主要給大家介紹了關(guān)于Python基礎(chǔ)教程之循環(huán)語句(for、while和嵌套循環(huán))的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Python 函數(shù)裝飾器應(yīng)用教程

    Python 函數(shù)裝飾器應(yīng)用教程

    函數(shù)裝飾器是Python提供的一種增強(qiáng)函數(shù)功能的標(biāo)記函數(shù),本文將帶大家深入學(xué)習(xí)一下Python 函數(shù)裝飾器,感興趣的同學(xué)跟隨小編一起學(xué)習(xí)吧
    2021-12-12
  • Python?Pandas如何獲取和修改任意位置的值(at,iat,loc,iloc)

    Python?Pandas如何獲取和修改任意位置的值(at,iat,loc,iloc)

    在我們對數(shù)據(jù)進(jìn)行選擇之后,需要對特定的數(shù)據(jù)進(jìn)行設(shè)置更改,設(shè)置,下面這篇文章主要給大家介紹了關(guān)于Python?Pandas如何獲取和修改任意位置的值(at,iat,loc,iloc)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-01-01

最新評論