第一章主要内容为学习基本的图像操作和处理,包括图像的灰度图、直方图、高斯滤波、直方图均衡化,完成这些处理需要安装一下几个库:PIL,matplotlib、PCV、SciPy。所有代码均参考Python计算机视觉网上教程,学习网址:http://yongyuan.name/pcvwithpython/
一、图像及灰度图
这个实验首先要安装PIL(Python图像处理类库)和matplotlib库
打开VSCode,在右下角的终端直接输入pip install pillow即可安装PIL库(我已经安装成功所以会显示下图结果,大家也可以通过这种方式检测是否安装成功)
同理,输入pip install matplotlib即可安装matplotlib库
下面为实验代码
from PIL import Image
from pylab import *
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
figure()
pil_im = Image.open('work1.jpg')
gray()
subplot(121)
title(u'原图',fontproperties=font)
axis('off')
imshow(pil_im)
pil_im = Image.open('work1.jpg').convert('L')
subplot(122)
title(u'灰度图',fontproperties=font)
axis('off')
imshow(pil_im)
show()
运行结果为:
关于代码,有一个图片路径的问题,有的人报错的原因是因为路径名前面没有加“r”(参考代码第五行),这里表示对路径的转义,\加上一个字母有时候会表示为一些特殊字符,所以一定要在路径前加上小写r,或者像我一样把图片和代码放在一个目录下,就不需要额外加入路径。
二、图像轮廓和直方图
这个实验也只需要用到PIL和matplotlib库,所以直接给代码:
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('work1.jpg').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()
实验结果为:
右侧直方图有时候会看不清整体情况,可以通过下方的放大镜按钮进行缩放,点击放大镜按钮后后,在直方图上按住鼠标左键拖动为放大,右键为缩小。
三、直方图均衡化
这里要用到PCV了,但是不能通过pip下载,需要下载压缩包,网址:https://github.com/jesolem/PCV
打开后点击右侧绿色按钮clone or download,接着点击Download ZIP下载,下载完成后解压文件,这时候切记不要直接安装,分别打开文件夹 PCV-master \ PCV \ tools ,找到tools文件夹之下的imtools文件,打开后将第27行代码print imname + "...skipped
替换为print (imname + "...skipped")
,这里是因为Python3的版本print需要加括号为正确语法。改完代码以后保存,退回PCV-master的文件夹目录下,找到setup.py文件,这是为了确定该文件所在目录,然后在该文件夹下按左shift+鼠标右键,点击“在此处打开Powershell窗口”,在弹出的窗口输入python setup.py install安装PCV。该部分参考同学的博客 https://liujiashengjason.club/2019/03/03/hello-world/
下面贴上代码:
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('work1.jpg').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()
实验结果为:
四、图像模糊
这个实验需要安装SciPy库,可以直接用pip安装,在终端输入pip install SciPy即可安装
代码部分:
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('work1.jpg').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)
#如果是彩色图像,则分别对三个通道进行模糊
#for bi, blur in enumerate([2, 5, 10]):
# im2 = zeros(im.shape)
# for i in range(3):
# im2[:, :, i] = filters.gaussian_filter(im[:, :, i], blur)
# im2 = np.uint8(im2)
# subplot(1, 4, 2 + bi)
# axis('off')
# imshow(im2)
show()
实验结果为:
五、学习总结
虽然这些代码都是参考学习网站的,但是我自己也看懂了,间接学习了python语言的语法。之后的学习中可能还要不断安装各种各样的库,这里建议大家可以去找找Anaconda的安装方法,这里有所有的python库。完成这次实验收获还是很多的,通过编辑博客会回头去看看自己原来的错误出在什么地方,巩固强化,最终解决问题。