甘肃政法学院
本科生实验报告
( 四)
姓名:周红
学院:信息工程学院
专业:信息管理与信息系统
班级: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小时内删除。
发表评论