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"

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值