opencv濾波

g(i,j) = alpha * f(i,j) + beta

alpha 對應着對比度

beta 對應着亮度圖像濾波的主要目的是爲了在保留圖像細節的情況下儘量的對圖像的噪聲進行消除,從而是後來的圖像處理變得更加的方便.

圖像的濾波效果要滿足兩個條件:
1.不能損壞圖像的輪廓和邊緣這些重要的特徵信息.
2.圖像的視覺效果更好

opencv支持圖像濾波,提供了五個基本算法,分別是方框濾波,均值濾波,高斯濾波,中值濾波以及雙邊濾波,前三種爲線性濾波算法,後兩種爲非線性濾波算法

一.方框濾波

     首先,線性濾波算法必須知道的概念叫做鄰域算子,是指利用一張圖片中給點的像素點的周圍的像素值決定該給定點的像素的一種算子,opencv中經常使用,用來做圖像的模糊或者是銳化,例如,鄰域算子實際上是一個X*Y的矩陣和該矩陣怎麼和圖像中的像素進行計算並得到最終的結果的一種集合性質的描述.
     方框濾波算法的原理很簡單,指定一個X*Y的矩陣大小,目標像素的周圍X*Y矩陣內的像素全部相加作爲目標像素的值,就這麼簡單.

二.均值濾波

     均值濾波其實就是方框濾波的默認歸一化版本,這個算法接口取消了歸一化參數,所以實際效果和方框濾波,差異不大

三.高斯濾波

     高斯濾波是專門用於消除滿足高斯分佈(正態分佈)的誤差而存在的濾波,此時鄰域算子是專門的高斯核,圖像中的像素與高斯核做卷積,生成的結果加權平均存放到目標像素中,對於抑制符合正態分佈的噪聲非常有效,並可以增強圖像值不同比例下的圖像效果,視覺效果類似於隔了一層半透明玻璃看圖像.

     API:void GaussianBlur(源圖像,目標圖像,Size 高斯內核,double 高斯核函數在X方向上的標準差,double 高斯核函數在Y方向的標準差,int 邊界模式).

     注:高斯核函數的大小必須爲奇數,同時也必須爲正數,原圖片可以使單通道或者是多通道,如果X,Y方向標準差都爲0,那麼API將自動根據核函數的長寬,計算出一個合適的二維零均值高斯函數.

四.中值濾波

     線性濾波的基本原理是對指定像素的指定鄰域的灰度值進行一個排序,然後選擇中間的灰度值來直接替代指定像素的灰度值,從而消除孤立的噪聲點,對於斑點噪聲和椒鹽噪聲尤其有用,同時還可以保存邊緣.對脈衝型的干擾尤其有效,因爲在實際情況中,噪聲點的灰度和鄰域的值的差別很大,所以,中值一般不容易是噪聲點灰度.但是因爲基於統計排序,所以運行時間一般是均值濾波的五倍以上.

     API:void medianBlur(源圖像,目標圖像,int 鄰域大小)

     注:鄰域必須是大於1的奇數

五.雙邊濾波 Bilateral Filtering

     前面的濾波,或多或少的都會使得目標點的像素受到鄰域的影響,鄰域越大,影響越大,而雙邊濾波同時考慮了圖像的灰度相似性和空間域信息,基本理念是鄰域的計算附帶權重,距離目標點越遠的鄰域像素對目標像素的影響越小,也就是權重越低,這樣,離得較遠的像素就不會對邊緣的影響過多,能很好的保存邊緣,同時也能濾波部分噪聲.

     但是,雙邊濾波保存了過多的高頻信息,對於彩色圖像中的高頻噪聲,雙邊濾波不能很好的濾除掉.

     API:void bilateralFilter(源圖像,目標圖像,int 像素鄰域直徑, ,double 顏色空間濾波器sigma doble 座標空間濾波器sigma,int 邊緣類型);
#coding=utf-8

import cv2
import matplotlib.pyplot as plt

src=cv2.imread("1.jpg")
#均值濾波
dst = cv2.blur(src,(3,3))
cv2.imwrite("123.jpg",dst)
#中值濾波
dst1= cv2.medianBlur(src,3)
cv2.imwrite("dst1.jpg",dst1)
#高斯濾波
dst2=cv2.GaussianBlur(src,(3,3),0)
cv2.imwrite("dst2.jpg",dst2)
#雙邊濾波
#9 鄰域直徑,兩個 75 分別是空間高斯函數標準差,灰度值相似性高斯函數標準差
dst3=cv2.bilateralFilter(src,9,75,75)
cv2.imwrite("dst3.jpg",dst3)
#coding=utf-8
import cv2
import numpy as np
from matplotlib import pyplot as plt
from ConfigParser import InterpolationError

src=cv2.imread("1.jpg")
#suofang
height,width=src.shape[:2]
res = cv2.resize(src,(2*width, 2*height), interpolation = cv2.INTER_CUBIC)
//3*width,3*windth
cv2.imwrite("res1.jpg",res)

#pingyi    
rows,cols = src.shape[:2]
M = np.float32([[1,0,18],[0,1,15]])
dst = cv2.warpAffine(src,M,(cols,rows))
cv2.imwrite("pingyi1.jpg",dst)

rows,cols = src.shape[:2]
M = np.float32([[1,0,24],[0,1,20]])
dst = cv2.warpAffine(src,M,(cols,rows))
cv2.imwrite("pingyi2.jpg",dst)


#xuanzhuan
rows,cols=src.shape[:2]
#第一個參數爲旋轉中心,第二個參數爲旋轉角度,第三個參數爲縮放比例
M = cv2.getRotationMatrix2D((cols/2,rows/2),45,1)#向左旋轉45度
M2 = cv2.getRotationMatrix2D((cols/2,rows/2),-45,1)#向左旋轉45度
#第三個參數:變換後的圖像大小
res2 = cv2.warpAffine(src,M,(rows,cols))
res3 = cv2.warpAffine(src,M2,(rows,cols))
cv2.imwrite("旋轉.jpg",res2)
cv2.imwrite("右旋轉.jpg",res3)

    #####多平移幾次相當於遮擋了
#仿射變換
img=cv2.imread('1.jpg')
rows,cols,ch=img.shape
pts1=np.float32([[10,10],[40,10],[10,40]])
pts2=np.float32([[2,16],[32,8],[8,40]])
pts3=np.float32([[10,10],[40,10],[10,40]])
pts4=np.float32([[2,20],[40,10],[10,50]])
M=cv2.getAffineTransform(pts1,pts2)
dst=cv2.warpAffine(img,M,(cols,rows))
M2=cv2.getAffineTransform(pts3,pts4)
dst2=cv2.warpAffine(img,M2,(cols,rows))
plt.subplot(221),plt.imshow(img),plt.title('Input')
plt.subplot(222),plt.imshow(dst),plt.title('Output')
plt.subplot(223),plt.imshow(img),plt.title('Input2')
plt.subplot(224),plt.imshow(dst2),plt.title('Output2')
plt.show()

#print "Done"

亮度與對比度
g(i,j) = alpha * f(i,j) + beta
alpha 對應着對比度
beta 對應着亮度

# -*- coding: utf-8 -*-
"""
Created on Sat Jan 11 10:41:52 2014
@author: duan
"""

import cv2
import numpy as np
from matplotlib import pyplot as plt
from ConfigParser import InterpolationError

alpha=1
beta=-20
alpha2=1
beta2=40
img=cv2.imread("1.jpg",0)
img2=cv2.imread("1.jpg",0)

#liangdu
x=y=0
res=img
res2=img2
# for x in range(0,img.shape[0]):
#     for y in range(0,img.shape[1]):
#         res.itemset((x,y), alpha*(img.item(x,y)) +beta)
#         res2.itemset((x,y),alpha*(img.item(x,y)) +beta2)
#         
# #duibidu
# x=y=0
# res=img
# res2=img2
# for x in range(0,img.shape[0]):
#     for y in range(0,img.shape[1]):
#         res.itemset((x,y),alpha*(img.item(x,y)))
#         res2.itemset((x,y),alpha2*(img2.item(x,y)))
#        
#         

#liangdu

for x in range(0,img.shape[0]):
    for y in range(0,img.shape[1]/3):
        res.itemset((x,y),(img.item(x,y)) + beta)
        res2.itemset((x,y),(img2.item(x,y)) + beta2)
cv2.imwrite("res2.jpg",res)
cv2.imwrite("res3.jpg",res2)

print "done"

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章