甘肃政法学院
本科生实验报告
( 四)
姓名:周红
学院:信息工程学院
专业:信息管理与信息系统
班级:2014信管班
实验课程名称:图形图像处理
实验日期: 2017年4 月5日
开课时间:2016-2017学年第 二 学期
甘肃政法学院实验管理中心印制


实验题目
图形图像处理
小组合作
姓名
周红
班级
2014信管班
学    号
201481020161
一、实验目的
1) 掌握读、写图像的基本方法。
2) 掌握Python语言中图像数据与信息的读取方法。
3) 理解图像灰度变换处理在图像增强的作用。
4) 掌握绘制灰度直方图的方法,理解灰度直方图的灰度变换及均衡化的方法。
二.实验环境
硬件:装有Windows 系统的计算机一台
软件:Anaconda Navigator (spyder)
三、实验内容与步骤
(1)熟悉python语言中对图像数据读取,显示等基本函数
(2)图像灰度变换处理在图像增强的作用
(3)绘制图像灰度直方图的方法,对图像进行均衡化处理
实验原理:
1. 灰度变换
灰度变换是图像增强的一种重要手段,它常用于改变图象的灰度范围及分布,是图象数字化及图象显示的重要工具。
1) 图像反转
灰度级范围为[0, L-1]的图像反转可由下式获得
2) 对数运算:有时原图的动态范围太大,超出某些显示设备的允许动态范围,如直接使用原图,则一部分细节可能丢失。解决的方法是对原图进行灰度压缩,如对数变换:
s = clog(1 + r)c为常数,r 0
3) 幂次变换:
4) 对比拉伸:在实际应用中,为了突出图像中感兴趣的研究对象,常常要求局部扩展拉伸某一范围的灰度值,或对不同范围的灰度值进行不同的拉伸处理,即分段线性拉伸:
其对应的数学表达式为:
2. 直方图均衡化
灰度直方图的横坐标是灰度级,纵坐标是该灰度级出现的频度,它是图像最基本的统计特征。依据定义,在离散形式下,用rk代表离散灰度级,用pr(rk)代表pr(r),并且有下式成立:
式中:nk为图像中出现rk级灰度的像素数,n是图像像素总数,而nk/n即为频数。
直方图均衡化处理是以累积分布函数变换法为基础的直方图修正法。假定变换函数为
(a) Lena图像                        (b) Lena图像的直方图
当灰度级是离散值时,可用频数近似代替概率值,即
式中:l是灰度级的总数目,pr(rk)是取第k级灰度值的概率,nk是图像中出现第k级灰度的次数,n是图像中像素总数。
所以积分可以表示为下列累计分布函数(cumulative distribution function, CDF)
四、实验过程与分析
实验具体实现:
1.熟悉python语言中对图像数据读取,显示等基本函数
(1)文件读取与信息显示:
import cv2
import numpy as np
①colorImg=cv2.imread('f:\\image\\lena.jpg')
②huiDuImg=cv2.imread('f:\\image\\lena.jpg',0)
③Img=cv2.cvtColor(colorImg,cv2.COLOR_RGBA2GRAY)
cv2.imshow('colorImg',colorImg)
cv2.imshow('huiDuImg',huiDuImg)
cv2.imshow('Img',Img)
cv2.waitKey(0)
cv2.destroyAllWindows()
图1文件的读取与显示显示
其中,①为读取彩图片② 为读取灰度图像设置图像像素为灰度,③与②效果相同。
(2)map颜矩阵的修改
import cv2
from PIL import Image
from pylab import *
im=array(Image.open('f:\\image\\lena.jpg'))
imshow(im)
print im
print im.shape #可以获取图像的形状,返回值是一个包含行数,列数,#通道数的数组,若图片是灰度图,则无通道数
for i in range(202):#i,j表示图像的大小,k表示(0,1,2)彩图片取值
    for j in range(323):
for k in range(3):
im[i,j,k]=((0.3)*im[i,j,k]+50)#进行矩阵修改
imshow(im)
cv2.waitKey(0)
cv2.destroyAllWindows()
图2 map颜矩阵的修改
3. 图像灰度变换处理在图像增强的作用:
图像反转:
import cv2
import numpy as np
im=cv2.imread('f:\\image\\lena.jpg',0)
cv2.imshow('im1',im)
print im
print im.shape
for i in range(300):
    for j in range(300):#i,j若设置的过小,则不能全部反转
im[i,j]=(-1)*im[i,j]+5//反转
cv2.imshow('im2',im)
cv2.waitKey(0)
cv2.destroyAllWindows()
图3图像反转效果图
3.绘制图像灰度直方图的方法,对图像进行均衡化处理
(1)图像灰度直方图的显示与灰度调整:
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('f:\\image\\lena.jpg',0)
’’’
统计并绘制直方图:应该使用calcHist()或者np. Histogram统计直方图
Cv2.calcHist(images,channels,mask,histSize,ranges[,hist[,accumulate]])返回hist值:[0]使用的通道;None:没有使用mask, [256]直方图大小,
[0,256]直方图柱范围,其中第一个参数必须要用[]括起来
’’’
hist_cv=cv2.calcHist([img],[0],None,[256],[0,256])
hist_np,bins=np.histogram(img.ravel(),256,[0,256])
hist_np2=np.bincount(img.ravel(),minlength=256)
plt.subplot(221),plt.imshow(img,'gray')
c
subplot在一张图中放多个子图
subplot将整个绘图区域等分成n行n列个子区域,然后按照从左到右,从上到下的顺序对每个子区域进行编号,左上的子区域编号为1,如果行数+列数+区域数<10,可以把他们缩写为一个整数eg:subplot(221)=subplot(2,2,1) #221第一行左图
plt.subplot(222),plt.plot(hist_cv) #222第一行右图
plt.subplot(223),plt.plot(hist_np) #223第二行左图
plt.subplot(224),plt.plot(hist_np2) #224第二行右图
图4图像灰度直方图的显示与灰度调整
(2)对B进行直方图均衡化处理,试比较与原图的异同:
原图像中目标物的灰度主要集中于高亮度部分,而且象素总数较多,所占的灰度等级较少。经过直方图均衡后,目标物的所占的灰度等级得到扩展,对比度加强,使整个图像得到增强。数字图像均衡化后,其直方图并非完全均匀分布,这是因为图像的象素个数和灰度等级均为离散值,而且均衡化使灰度级并归。因此,均衡化后,其直方图并非完全均匀分布。代码和结果截图如下所示
import cv2
import matplotlib.pyplot as plt
img=cv2.imread('f:\\image\\lena.jpg',0)
res=cv2.equalizeHist(img)#直方图均衡化
#为了同时在一个窗口中显示多个图像,使用plt.subplot()
plt.subplot(121),plt.imshow(img,'gray')
plt.subplot(122),plt.imshow(res,'gray')
图5直方图均衡化处理比较异同
(3)对B进行如图所示的分段线形变换处理,试比较与直方图均衡化处理的异同。
from skimage import data,exposure
import matplotlib.pyplot as plt
img=cv2.imRead(‘f:\\image\\lena.jpg’,0);
plt.figure('hist',figsize=(8,8))
arr=img.flatten();#将2维数组一维化
plt.subplot(221)
plt.imshow(img,ay)
#原始图像
plt.subplot(222)
#原始图像直方图
plt.hist(arr,bins=256,normed=1,edgecolor='None',facecolor='red')
#原始图像均衡化
img1=exposure.equalize_hist(img)
arr1=img1.flatten()
plt.subplot(223)
plt.imshow(img1,ay)
局部直方图均衡化plt.subplot(224)
#均衡化图像直方图
plt.hist(arr1,bins=256,normed=1,edgecolor='None',facecolor='red')
plt.show()
图6分段线形处理比较异同结果
五、实验总结
图形图像处理是一门十分有用的学科,在实际生活中应用很广泛。经过此次的实验,感受到Python语言的强大,不过因为刚入门,还不具体了解其功能,第一次实验做的很吃力。在实验中遇到了很多棘手的问题,同学对我的帮助很大,让我逐一解决难题。经过这次的实验,我了解了imread()读取彩图像/灰度图像,imshow()显示图像,文件的结尾需要加上cv2.waitKey(),cv2.destroyAllWindows()来结束进程。这些都是基本的知识,我知道后面的实验会更加具有挑战性,希望以后可以学到更多的知识从而感受图形图像处理的巨大魅力。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。