1. 图像滤波效果
    1. 1. 不同图像滤波效果
    2. 2. 安装opencv
    3. 3. 高通滤波器
    4. 4. 低通滤波器
    5. 5. 参考文献:

图像滤波效果

1. 不同图像滤波效果

在图像处理中,通常会用到一些经典的卷积滤波器,如低通滤波器、高通滤波器、高斯滤被器,这些滤波器会产生不同的效果。

卷积滤波是图像处理中非常重要的工具,使用简单的儿行代码就能实现许多Photoshop 能够达到的放果:

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

image = cv2.imread('test.jpg')
cv2.imshow('original',image)

## 低通滤波
kernal = np.array([[.11, .11, .11],
                       [.11, .11, .11],
                       [.11, .11, .11]])
rect = cv2.filter2D(image, -1 , kernal)
cv2.imwrite('rect.jpg', rect)

## 高斯滤波
kernal = np.array([[1, 4, 7, 4,1],
                   [4,16,26,26,4],
                   [7,26,41,26,7],
                   [4,16,26,16,4],
                   [1, 4, 7, 4,1] ])
gaussian = cv2.filter2D(image, -1 , kernal)
cv2.imwrite('gaussian.jpg', gaussian)
## 锐化
kernal = np.array([
    [0,-2, 0],
    [-2,9,-2],
    [0,-2, 0]])
sharpen = cv2.filter2D(image, -1 , kernal)
cv2.imwrite('sharpen.jpg', sharpen)
## 边缘检测
kernal = np.array([[-1,-1,-1],
                   [-1, 8,-1],
                   [-1,-1,-1] ])
edges = cv2.filter2D(image, -1 , kernal)
cv2.imwrite('edges.jpg', edges)
## 浮雕
kernal = np.array([[-2,-2,-2,-2,0],
                   [-2,-2,-2, 0,2],
                   [-2,-2,-2, 2,2],
                   [-2, 0, 2, 2,2],
                   [ 0, 2, 2, 2,2] ])
emboss = cv2.filter2D(image, -1 , kernal)
cv2.imwrite('emboss.jpg', emboss)

2. 安装opencv

How to install python opencv through Conda?

https://anaconda.org/menpo/opencv3

conda 安装方法:

conda install -c menpo opencv
conda install --channel https://conda.anaconda.org/menpo opencv3
conda install -c conda-forge opencv=3.1.0

验证是否安装成功

import cv2
print cv2.__version__

3. 高通滤波器

  高通滤波器(HPF)是检测图像的某个区域,然后根据像素与周围像素的亮度差值来提升(boost)该像素的亮度 的滤波器。

  核是指一组权重的集合,它会应用在源图像的一个区域,并由此生成目标图像的一个像素。比如,大小为7的核意味着每49(7 x 7)个源图像的像素会产生目标图像的一个像素。可把核看作一块覆盖在源图像上可移动的毛玻璃片,玻璃片覆盖区域的光线会按某种方式进行扩散混合后透过去。

  在计算完中央像素与周围邻近像素的亮度差值之和以后,如果亮度变化很大,中央像素的亮度会增加(反之则不会)。换句话说,如果一个像素比它周围的像素更突出,就会提升它的亮度。这在边缘检测上尤其有效,它会采用一种称为高频提升滤波器(high boost filter)的高通滤波器。

  高通和低通滤波器都有一个称为半径(radius)的属性,它决定了多大面积的邻近像素参与滤波计算。下面是一个高通滤波器的例子。


import cv2
import numpy as np
from scipy import ndimage
kernal_3x3 = np.array([[-1, -1, -1],
                       [-1,  8, -1],
                       [-1, -1, -1]])
kernal_5x5 = np.array([[-1, -1, -1, -1, -1],
                       [-1,  1,  2,  1, -1],
                       [-1,  2,  4,  2, -1],
                       [-1,  1,  2,  1, -1],
                       [-1, -1, -1, -1, -1]])
## 使用函数cv2.imread() 读入图像.后面要加上0,表示灰度模式读入图像
img = cv2.imread('test.jpg',0)
## 注:使用ndimage.convolve()时,滤波核的维度应与原始图像的维度相同,故此采用灰度图
k3 = ndimage.convolve(img, kernal_3x3)  
k5 = ndimage.convolve(img, kernal_5x5)

blurred = cv2.GaussianBlur(img, (11, 11), 0)
g_hpf = img - blurred
cv2.imshow("image", img)
cv2.imshow("3x3", k3)
cv2.imshow("5x5", k5)
cv2.imshow("g_hpf", g_hpf)
cv2.waitKey()
cv2.destroyAllWindows()

 导入模块之后,我们定义一个3x3和一个5x5的核,然后将读入的图像转换为灰度格式。通常大多数的图像处理会用NumPy来完成,但是这里的情况比较特殊,因为需要用一个给定的核与图像进行“卷积”(convolve),但是NumPy碰巧只接受一维数组。ndimage的convolve()函数支持经典的NumPy数组,cv2模块用这种数组来存储图像。

  还有一种方法可实现高通滤波器:通过对图像应用低通滤波器之后,与原始图像计算差值。

4. 低通滤波器

  高通滤波器是根据像素与邻近像素的亮度差值来提升该像素的亮度。低通滤波器(Low Pass Filter, LPF)则是在像素与周围像素的亮度差值小于一个特定值时,平滑该像素的亮度。它主要用于去噪和模糊化,比如说,高斯模糊是最常用的模糊滤波器(平滑滤波器)之一,它是一个削弱高频信号信息强度的低通滤波器。

5. 参考文献:


技术交流学习,请加QQ微信:631531977
目录