使用python解决图像处理中直方图、高斯滤波以及直方图均衡化问题小记

使用python解决图像处理中直方图、高斯滤波以及直方图均衡化问题小记

  • 安装python(x,y)以及配置opencv
  • 测试PCV和opencv是否安装成功
  • 使用python进行基本的图像处理
    • 理论解释
    • 代码运行结果
    • 代码

安装python(x,y)以及配置opencv

安装python(x,y)以及安装配置PCV、 VLfeat库是通过学习《Python计算视觉编程》安装篇来完成的(http://yongyuan.name/pcvwithpython/)
而安装配置opencv在python所在的文件目录下使用pip命令就可以实现下载和安装。

测试PCV和opencv是否安装成功

C:\Users\LX>python
Python 2.7.10 (default, May 23 2015, 09:40:32) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> import PCV
>>>          

上面两个import没有报错说明这两个库导入成功

使用python进行基本的图像处理

理论解释

  1. 直方图 只考虑多少的问题,不考虑在哪儿的问题。显示图像数据时会以左暗右亮的分布直方图形式呈现出来,而不是显示原图像数据。通俗易懂的讲就是:直方图的x轴从左到右代表的是由暗到明的数值(灰度值从0到255)。y轴代表的是对应灰度值的像素量。

  2. 直方图均衡化 又称直方图平坦化,实质上是对图像进行非线性拉伸,重新分配图像象元值,使一定灰度范围内象元值的数量大致相等。这样,原来直方图的峰顶部分对比度得到增强,而谷底部分对比度降低,输出图像的直方图是一个较平的分段直方图。
    要进行直方图均衡化的原因:一个图像,当每一个灰度值分布越均衡,图像所包含的信息量是越大的;相反,仅仅只有一个灰度值的时候,信息量很少。这样通过直方图的均衡化就可以使原本分布不均匀的各个灰度值变得更加均匀。但是,直方图均衡化只是使得图像信息量变大,不可能把较小的灰度值在经过均衡化后变得比原来较大的灰度值更大。可见通过均衡化后的图所观察到的景物应当与原来图像所观察到的一致,只是颜色层次更清晰,更加具有辨识度。

  3. 高斯滤波 首先与均值滤波有所不同,均值滤波其核心思路是取每一个像素点邻域的矩形窗口,计算矩形窗口内所有像素点的像素平均值,作为该点滤波之后的像素值;高斯滤波只不过其权重与均值滤波不一样。高斯滤波的权重服从二维正态分布,越靠近窗口中心点(也即当前滤波点),权重越大。可以理解标准差越大滤波效果越好图像就会越模糊。

代码运行结果

原图:

使用python解决图像处理中直方图、高斯滤波以及直方图均衡化问题小记_第1张图片

  1. 直方图
    使用python解决图像处理中直方图、高斯滤波以及直方图均衡化问题小记_第2张图片

  2. 直方图均衡化

使用python解决图像处理中直方图、高斯滤波以及直方图均衡化问题小记_第3张图片

  1. 高斯滤波
    (可见标准差越大图像越模糊)

标准差越大图像就越模糊

代码

  1. 图像轮廓和直方图
# -*- coding: utf-8 -*-   #这句改变编码方式的语句要加在前两行,不然会起不了作用
from PIL import Image
from pylab import *

# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
im = array(Image.open('D:/1.1.1.jpeg').convert('L'))  # 打开图像,并转成灰度图像

figure()
subplot(121)
gray()
contour(im, origin='image')
axis('equal')
axis('off')
title(u'图像轮廓', fontproperties=font)

subplot(122)
hist(im.flatten(), 128)
title(u'图像直方图', fontproperties=font)
plt.xlim([0,260])
plt.ylim([0,11000])

show()
        
  1. 直方图均衡化
from PIL import Image
from pylab import *
from PCV.tools import imtools

# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)

im = array(Image.open('D:/1.1.1.jpeg').convert('L'))  # 打开图像,并转成灰度图像
#im = array(Image.open('../data/AquaTermi_lowcontrast.JPG').convert('L'))
im2, cdf = imtools.histeq(im)

figure()
subplot(2, 2, 1)
axis('off')
gray()
title(u'原始图像', fontproperties=font)
imshow(im)

subplot(2, 2, 2)
axis('off')
title(u'直方图均衡化后的图像', fontproperties=font)
imshow(im2)

subplot(2, 2, 3)
axis('off')
title(u'原始直方图', fontproperties=font)
#hist(im.flatten(), 128, cumulative=True, normed=True)
hist(im.flatten(), 128, normed=True)

subplot(2, 2, 4)
axis('off')
title(u'均衡化后的直方图', fontproperties=font)
#hist(im2.flatten(), 128, cumulative=True, normed=True)
hist(im2.flatten(), 128, normed=True)

show()

       
  1. 高斯滤波

from PIL import Image
from pylab import *
from scipy.ndimage import filters

# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)

#im = array(Image.open('board.jpeg'))
im = array(Image.open('D:/1.1.1.jpeg').convert('L'))

figure()
gray()
axis('off')
subplot(1, 4, 1)
axis('off')
title(u'原图', fontproperties=font)
imshow(im)

for bi, blur in enumerate([2, 5, 10]):
  im2 = zeros(im.shape)
  im2 = filters.gaussian_filter(im, blur)
  im2 = np.uint8(im2)
  imNum=str(blur)
  subplot(1, 4, 2 + bi)
  axis('off')
  title(u'标准差为'+imNum, fontproperties=font)
  imshow(im2)
  show()  

你可能感兴趣的:(python)