Python计算机视觉——实验一 图像的基本操作

本文通过Python的PIL和OpenCV库对比了读取图像的差异,展示了thumbnail()和resize()创建图像缩略图的不同,以及图像的灰度变换和直方图均衡化技术。实验还包括了图像的轮廓绘制和直方图展示,探讨了图像处理的基本方法。
摘要由CSDN通过智能技术生成

一.实验目的:

1.分别使用PIL库和OpenCV库读取图像并实现可视化,对比0penCV读取和PIL读取的差异;

2.利用thumbnail()函数创建图像缩略图,利用resize()函数处理图像,对比两者差别;

3.绘制图像的轮廓与直方图;

4.实现图像的灰度变换、直方图均衡化;

5.实现图像的不同高斯模糊、计算导数;

6.形态学计数(计算圆形个数等)、去噪;(可选)

二.实验平台

VS code Python 3.8.8

三.实验内容与结果

本次实验采用的图片:jmu.jpg

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) # 查看图片通道数

输出:

(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]) # 图片宽

输出:

(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)

输出:

(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)

输出:

(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()

输出:

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)将灰度图像进行反相处理:

(2)将图像的像素值变换到100...200区间

(3)对图像使用二次函数变换

(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()

输出:

原图:

均衡化后的图像:

5.实现图像的不同高斯模糊、计算导数;

导包出现版本问题,无法运行

6.形态学计数(计算圆形个数等)、去噪;(可选)

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值