python+图像出现的问题
专业相关,将在用python处理图像问题中遇到的问题整理下来。
1.python matplotlib 中文显示参数设置
有时候无法正常显示中文的原因:
大致就是matplotlib库中没有中文字体。
解决方案
每次编写代码时进行参数设置
#coding:utf-8
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
#有中文出现的情况,需要u'内容'
2.img[:,:,::-1]的作用
转载自:img[:,:,::-1]的作用
作用就是实现RGB到BGR通道的转换 (若图片一开始就是BGR的,就是实现从BGR到RGB的转换)。
对于列表img进行img[:,:,::-1]的作用是列表数组左右翻转,例如:
import numpy as np
a = np.arange(27).reshape(3,3,3)
print(a)
'''
[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]]
[[ 9 10 11]
[12 13 14]
[15 16 17]]
[[18 19 20]
[21 22 23]
[24 25 26]]]
'''
b = a[:,:,::-1]
print(b)
'''
[[[ 2 1 0]
[ 5 4 3]
[ 8 7 6]]
[[11 10 9]
[14 13 12]
[17 16 15]]
[[20 19 18]
[23 22 21]
[26 25 24]]]
'''
可以明确看出,[:,:,::-1]的作用就是对数组进行左右翻转。那为什么对于图像而言却能实现RGB通道转换为BGR通道呢?先看一些读取图片的方法是怎么读取吧
一般有opencv(cv2)和matplotlib(plt)的读取方式:(cv2把图片读取后是把图片读成BGR形式的,plt则是读成RGB形式)
用opencv(即cv2)读取图片,是以BGR的形式来读取的。我们用cv2的imshow()函数显示图片发现跟我们打开图片的样子一样,是因为cv2的imshow()又把BGR转回RGB再显示。
但cv2确实是以BGR形式读取图片的,而plt则是以RGB形式。
3.img.shape
img.shape[:2] 取彩色图片的长、宽。 img.shape[:3] 则取彩色图片的长、宽、通道。
关于img.shape[0]、[1]、[2]
img.shape[0]:图像的垂直尺寸(高度)
img.shape[1]:图像的水平尺寸(宽度)
img.shape[2]:图像的通道数
在矩阵中,[0]就表示行数,[1]则表示列数
4.Img[:,:,2]
opencv假设图像是RGB三分量组成的图像,那么图像的
- 第一通道是R, 第二通道是G, 第三通道是B
Img[:,:,2]代表R通道,也就是红色分量图像;
Img[:,:,1]代表G通道,也就是绿色分量图像;
Img[:,:,0]代表B通道,也就是蓝色分量图像。
5.Python中读取、显示和保存图片的方法
转载自以下链接
python读取图片
方法1:利用 PIL 中的 Image 函数
这个函数读取出来不是 array 格式,这时候需要用 np.asarray(im) 或者 np.array(im)函数将其处理成array格式。
区别:np.array() 是深拷贝,np.asarray() 是浅拷贝。浅拷贝只拷贝父对象,不会拷贝对象的内部的子对象;深拷贝会拷贝对象及其子对象。
from PIL import Image
import numpy as np
#读取
image = Image.open('fur.jpg')
#显示
image.show()
#保存
image.save('new.jpg')
#转换成array
im_array = np.array(image)
print(im_array.shape)
#array转换成image
img = Image.fromarray(np.uint8(im_array))
img.save('new1.jpg') #还可以指定图片质量img