Python 计算机视觉(三)—— 数字图像处理基本操作

目录

1. 读取显示图像

(1)读取图像

cv2.imread() 函数

image.open() 函数

(2)显示图像

cv2.imshow()函数

​img.show()函数

2. 读取修改像素

(1)读取像素

print(img.shape)函数

print(img.size)函数

print(img)函数

使用 numpy 库

像素值不同的原因

(2)修改像素

3. 保存图像

(1)使用 PIL 库

(2)使用 OpenCV 库

4. 获取图像属性

总结


1. 读取显示图像

读取显示这部分在前面已经记录过了,在这里我们简单过一下: Python 计算机视觉(二) —— OpenCV 基础

(1)读取图像

cv2.imread() 函数

import cv2
img1 = cv2.imread('E:\Python\StudyOfOpencv\qilin1.jpeg')

注意路径中不能包含有中文以及一些莫名其妙的空格哦 ,不然会报错

imread() 函数不仅仅只有一个图像路径的参数 ,路径后面还有一个 flag 参数可以决定读入的图像的颜色类型

至于该参数可选取的值以及意义如下:

IMREAD_ANYCOLOR = 4       #读取彩色图像
IMREAD_ANYDEPTH = 2       #读取灰度图像
IMREAD_COLOR = 1              #读取彩色图像
IMREAD_GRAYSCALE = 0     #读取灰度图像

IMREAD_IGNORE_ORIENTATION = 128

IMREAD_LOAD_GDAL = 8

IMREAD_REDUCED_COLOR_2 = 17
IMREAD_REDUCED_COLOR_4 = 33
IMREAD_REDUCED_COLOR_8 = 65

IMREAD_REDUCED_GRAYSCALE_2 = 16
IMREAD_REDUCED_GRAYSCALE_4 = 32
IMREAD_REDUCED_GRAYSCALE_8 = 64

IMREAD_UNCHANGED = -1

至于其他的一些参数的意义可以自己去尝试得到输出进行观察

image.open() 函数

使用该方法读取到的是图片本身

from PIL import Image

安装 PIL 库时可能会报错,试着安装 Pillow-PIL 

from PIL import Image
img2 = Image.open('E:\Python\StudyOfOpencv\qilin2.jpeg')

(2)显示图像

cv2.imshow()函数

使用 imread 函数读取图像,显示图像使用 cv2.imshow() 函数,但需要创建显示窗口,在窗口中显示图像,这些我也在前面的那篇文章中提到过

import cv2
img1 = cv2.imread('E:\Python\StudyOfOpencv\qilin1.jpeg')  #读取图像
cv2.namedWindow("Qilin") 
cv2.imshow("Qilin", img1)                                 #显示图像
cv2.waitKey(delay = 0)

得到图像显示:

 img.show()函数

使用的是 Image.open() 函数读取图像,则需要用该函数显示图像,不需要创建窗口

img.show() 中的 img 是图像名称,需要进行修改

from PIL import Image
img2 = Image.open('E:\Python\StudyOfOpencv\qilin2.jpeg')   #读取图像
img2.show()  #显示图像

使用该函数打开图像可能会报错,提示没有对应软件打开文件

解决方法:打开设置-->应用 --> 默认程序 --> 选择报错的文件后缀为其添加默认的应用软件

得到图像显示:

在此处是用图像软件打开的,原因就是上面提到的需要为该文件添加默认打开软件

2. 读取修改像素

(1)读取像素

print(img.shape)函数

使用 cv2.imread() 函数读取图像后,为显示图像的类型以及分辨率可以使用该函数

print(img1.shape)

得到输出:(506, 564, 3)

说明该图像是 564*506 的三通道 图像,至于分辨率为什么反过来后面再说

print(img.size)函数

使用 Image.open() 得到图像后使用该函数输出图像的大小,即分辨率

print(img2.size)

得到输出:(564, 506)

可以看出刚好和前面的是反过来的

print(img)函数

使用 cv2.imread() 函数得到的图像要用该函数输出像素值:

print(img1)

[[[254 251 253]
  [254 251 253]
  [254 251 253]
  ...
  [245 236 227]
  [245 236 227]
  [245 236 227]]

 [[254 251 253]
  [254 251 253]
  [254 251 253]
  ...
  [245 236 227]
  [245 236 227]
  [245 236 227]]

 [[254 251 253]
  [254 251 253]
  [254 251 253]
  ...
  [245 235 228]
  [245 235 228]
  [245 235 228]]

 ...

 [[ 45  62  71]
  [ 44  62  69]
  [ 44  61  70]
  ...
  [ 32  46  42]
  [ 32  46  42]
  [ 32  46  42]]

 [[ 41  57  64]
  [ 41  57  63]
  [ 41  57  64]
  ...
  [ 27  41  37]
  [ 32  46  42]
  [ 31  45  41]]

 [[ 43  57  63]
  [ 43  57  63]
  [ 43  57  63]
  ...
  [ 27  41  37]
  [ 32  46  42]
  [ 31  45  41]]]

使用 numpy 库

前面提到过,使用 Image.open() 函数得到的图象是原始的图像,所以需要将它转化为数组形式再进行输出得到相应的像素点值

from PIL import Image
import numpy as np
img2 = Image.open('E:\Python\StudyOfOpencv\qilin1.jpeg')
image = np.asarray(img2)
print(image)

[[[253 251 254]
  [253 251 254]
  [253 251 254]
  ...
  [227 236 245]
  [227 236 245]
  [227 236 245]]

 [[253 251 254]
  [253 251 254]
  [253 251 254]
  ...
  [227 236 245]
  [227 236 245]
  [227 236 245]]

 [[253 251 254]
  [253 251 254]
  [253 251 254]
  ...
  [228 235 245]
  [228 235 245]
  [228 235 245]]

 ...

 [[ 71  62  45]
  [ 69  62  44]
  [ 70  61  44]
  ...
  [ 42  46  32]
  [ 42  46  32]
  [ 42  46  32]]

 [[ 64  57  41]
  [ 63  57  41]
  [ 64  57  41]
  ...
  [ 37  41  27]
  [ 42  46  32]
  [ 41  45  31]]

 [[ 63  57  43]
  [ 63  57  43]
  [ 63  57  43]
  ...
  [ 37  41  27]
  [ 42  46  32]
  [ 41  45  31]]]

像素值不同的原因

通过两种不同的函数得到的图像读取的像素刚好是反过来的这是因为:cv2.imread() 读取的是 BGR 格式,而 Image.open() 读取的是 RGB 格式,所以它们两者的 Red&Blue 通道刚好反过来了

而且使用 cv2.imread() 函数得到的图像本来就是经过采样的,所以可以直接打印分辨率,然而 image.open() 函数得到的图像则是原本的图像,所以需要将其转化为数组形式才能打印分辨率

(2)修改像素

要将图像修改为灰度图,那么在 OpenCv 库中使用 cvtColor() 函数就可以实现,这在上一篇文章中提到过

但如果是使用 Image.open() 库得到的图像,则需要对每一个像素点的像素值进行调整

img2 = Image.open('E:\Python\StudyOfOpencv\qilin1.jpeg')
pix = img2.load()     #导入像素
width = img2.size[0]  #获取宽度
height = img2.size[1] #获取长度
temp = 1
for x in range(width):   #遍历宽度
    temp += 1
    for y in range(height):     #遍历长度
        if temp % 2 == 0:                 #每隔一个像素点转化为一个白点
            img2.putpixel((x, y), (255, 255, 255))
img2.show()

得到图像如上 

3. 保存图像

(1)使用 PIL 库

(之前的图案因为不明原因违规取消了,现在换个图片,但愿不会再次违规)

对于上面的得到的图像使用 img2.save() 函数就可以进行保存:

img2.save('E:\Python\StudyOfOpencv\qilin1_1.jpeg')

 (2)使用 OpenCV 库

首先我们将图像转化为灰度图像:

img1 = cv2.imread('E:\Python\StudyOfOpencv\qilin1.jpeg')
cv2.namedWindow("Qilin")
img_gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)          #对图像进行灰度处理
cv2.imshow("Qilin", img_gray)

得到的灰度图像如下: 

 再将其保存: 

cv2.imwrite('E:\Python\StudyOfOpencv\qilinone.jpeg', img_gray)

如果报错了检查一下是否在保存路径中忘了添加图像后缀 

4. 获取图像属性

使用 cv2.imread() 函数读取图像后,为显示图像的类型以及分辨率可以使用 print(img.shape), 前面提到过,这里就不赘述了

也提到过 print(img.size) 当然这适用于使用 Image.open() 得到的图像

总结

这篇文章主要承接了上一篇文章 —— OpenCV 基础,记录了其他的几种显示图像,保存图像、观察图像特性的方法,主要也是为后面的学习打下基础

  • 16
    点赞
  • 127
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一马归一码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值