一.实验目的:
1.分别使用PIL库和OpenCV库读取图像并实现可视化,对比0penCV读取和PIL读取的差异;
2.利用thumbnail()函数创建图像缩略图,利用resize()函数处理图像,对比两者差别;
3.绘制图像的轮廓与直方图;
4.实现图像的灰度变换、直方图均衡化;
5.实现图像的不同高斯模糊、计算导数;
6.形态学计数(计算圆形个数等)、去噪;(可选)
二.实验平台
VS code Python 3.8.8
三.实验内容与结果
本次实验采用的图片:jmu.jpg
![](https://i-blog.csdnimg.cn/blog_migrate/d913560e866496f1f6465d7ba7764b1f.png)
1.分别使用PIL库和OpenCV库读取图像并实现可视化,对比0penCV读取和PIL读取的差异;
(1)使用PIL库读取图像并实现可视化
代码:
from PIL import Image
# 导入pyplot并将其命名为plt
import matplotlib.pyplot as plt
import pylab
img1 = Image.open('jmu.jpg')
plt.imshow(img1)
pylab.show()
print(img1.size) # 图片宽×高
print(img1.size[0]) # 图片宽
print(img1.size[1]) # 图片高
print(img1.mode) # 查看图片通道数
输出:
![](https://i-blog.csdnimg.cn/blog_migrate/72ffb990c5c4248e98a504e047fa4d89.png)
(2)使用OpenCV库读取图像并实现可视化
代码:
import cv2
from matplotlib import pyplot as plt
import pylab
img2 = cv2.imread('jmu.jpg')
plt.imshow(img2)
pylab.show()
print(img2.shape) # 查看图片信息 高×宽×通道数
print(img2.shape[0]) # 图片高
print(img2.shape[1]) # 图片宽
输出:
![](https://i-blog.csdnimg.cn/blog_migrate/74c537994f88ae88074ba7cc3d02b487.png)
(3)0penCV读取和PIL读取的差异
读取图片函数:
Image.open()读取的通道顺序是RGB
cv2.imread()读取的通道顺序为BGR
图片写入:
PIL.Image.save()直接保存RGB的图片
cv2.imwirte()保存图片的时候相当于做了BGR2RGB再去保存
2.利用thumbnail()函数创建图像缩略图,利用resize()函数处理图像,对比两者差别;
(1)利用thumbnail()函数创建图像缩略图
代码:
from PIL import Image
from matplotlib import pyplot as plt
import pylab
img3 = Image.open('jmu.jpg')
print("初始尺寸",img3.size)
img3.thumbnail((88,88))
print("Image.resize",img3.size)
plt.imshow(img3)
pylab.show()
# 初始尺寸 (294, 198)
输出:
![](https://i-blog.csdnimg.cn/blog_migrate/ea1b3697892f99c4bda82f8e775443e4.png)
(2)利用resize()函数处理图像
代码:
from PIL import Image
from matplotlib import pyplot as plt
import pylab
img4 = Image.open('jmu.jpg')
print("初始尺寸",img4.size)
img5=img4.resize((500,500))
print("Image.resize",img5.size)
plt.imshow(img5)
pylab.show()
# 初始尺寸 (294, 198)
# Image.resize (500, 500)
输出:
![](https://i-blog.csdnimg.cn/blog_migrate/33fe5d2b3692937a45f5f22b40ac9215.png)
(3)thumbnail()方法和resize()方法的差别
resize()方法可以缩小也可以放大,而thumbnail()方法只能缩小;
resize()方法不会改变对象的大小,只会返回一个新的Image对象,而thumbnail()方法会直接改变对象的大小,返回值为none;
resize()方法中的size参数直接规定了修改后的大小,而thumbnail()方法按比例缩小,size参数只规定修改后size的最大值。
3.绘制图像的轮廓与直方图;
代码:
# -*- coding:UTF-8 -*-
import array
from PIL import Image
from pylab import *
import pylab
#读取图像到数组中
img6 = array(Image.open('jmu.jpg').convert('L'))
#新建一个图像
figure()
#不使用颜色信息
gray()
#在原点的左上角显示轮廓图像
contour(img6,origin='image')
axis('equal')
axis('off')
#绘制直方图
figure()
hist(img6.flatten(),128) #flatten()方
plt.imshow(img6)
pylab.show()
输出:
![](https://i-blog.csdnimg.cn/blog_migrate/e1465a88c4f23f479faa78b079127506.png)
4.实现图像的灰度变换、直方图均衡化;
(1)图像的灰度变换
代码:
import array
from PIL import Image
from numpy import*
from matplotlib import pyplot as plt
import pylab
img7=array(Image.open('jmu.jpg').convert('L'))
img8=255-img7 #对图像进行反相处理
plt.imshow(img8)
plt.show() #如果不加这个,第三张图片会覆盖前两张图片,只显示第三张
img9=(100.0/255)*img7+100 #将图像像素值变换到100...200区间
plt.imshow(img9)
plt.show()
img10=255.0*(img7/255.0)**2 #对图像像素值求平方后得到的图像
plt.imshow(img10)
plt.show()
输出:
(1)将灰度图像进行反相处理:
![](https://i-blog.csdnimg.cn/blog_migrate/430ae9e8941c58d0590d6d2aa68764ca.png)
(2)将图像的像素值变换到100...200区间
![](https://i-blog.csdnimg.cn/blog_migrate/6c5cbcb9c8b0bb7ec10bb4ba4b9b1dca.png)
(3)对图像使用二次函数变换
![](https://i-blog.csdnimg.cn/blog_migrate/99b7a5c640c85f7208ec91ef581d5099.png)
(2)直方图均衡化
代码:
from PIL import Image
from matplotlib import figure
import matplotlib.pyplot as plt
import numpy as np
# 直方图均衡化
def histeq(img,nbr_bins=256):
"""对一幅灰度图像进行直方图均衡化"""
# 计算图像的直方图
imhist,bins = np.histogram(img.flatten(), nbr_bins, density=True)
# # 累计分布函数
cdf = imhist.cumsum()
cdf = 255 * cdf / cdf[-1] # 归一化
# # 使用累积分布函数的线性插值,计算新的像素值
img2 = np.interp(img.flatten(), bins[:-1], cdf)
return img2.reshape(img.shape),cdf
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
img11 = np.array(Image.open('JMU.jpg').convert('L'))
print('原图:')
plt.imshow(img11)
plt.show()
print("均衡化后的图像:")
img12, cdf = histeq(img11)
plt.imshow(img12)
plt.show()
#绘制原图的直方图
figure()
plt.hist(img11.flatten(),128) #flatten()方法将任意数组按照行优先准则转换成一维数组
print('原图的直方图:')
plt.show()
#绘制均衡化之后的直方图
figure()
plt.hist(img12.flatten(),128) #flatten()方法将任意数组按照行优先准则转换成一维数组
print('均衡化之后的直方图:')
plt.show()
输出:
原图:
![](https://i-blog.csdnimg.cn/blog_migrate/2a8d77815671be5bf0d5175ba6b0915e.png)
均衡化后的图像:
![](https://i-blog.csdnimg.cn/blog_migrate/f6ffc223be2d3803fe04082c2ca8bee3.png)
5.实现图像的不同高斯模糊、计算导数;
导包出现版本问题,无法运行
![](https://i-blog.csdnimg.cn/blog_migrate/f7b87de76e990622b1695e226f9f3118.png)