乐趣区

关于python:关于图像的一些基本操作

一、Numpy

# numpy 图像应用 np 来 reshape
img = np.reshape(img,(new_H,new_W,new_C))   
img = img.reshape(new_H,new_W,new_C)         # 另一种写法

# 以上两种写法等价,另外不能去掉“img =”,否则没有 reshape 成果。# new_W*new_H*new_C 必须等于 old_H*old_W*old_C。否则会报错
# 这种 reshape 不倡议用于图像,因为它会搞乱 HW 与 C 之间的关系, 毁坏掉图像 
# numpy 图像应用 np 来 resize
img=np.resize(img,(new_H,new_W,new_C))   
img.resize(new_H,new_W,new_C)      # 另一种写法

# 以上两种写法等价,并且不能加上“img =”,否则会报错。# new_W*new_H*new_C 必须等于 old_H*old_W*old_C。否则会报错
# 这种 resize 也不倡议用于图像,因为它会搞乱 HW 与 C 之间的关系, 毁坏掉图像 
img = np.zeros((H,W),dtype=np.uint8)

二、CV2

# 读取 numpy 图像
img = cv2.imread('test.jpg', 0)   # 这个参数 0,等价于:cv2.IMREAD_GRAYSCALE(灰度)# 加一个参数 0 示意读取灰度图
# H,W,C = img.shape
# numpy 图像应用 cv2 来 resize
img = cv2.resize(img, (new_W, new_H), interpolation=cv2.INTER_LINEAR)

# new_W*new_H 能够不等于 old_H*old_W,后果就是形变
# 能够不写“img =”这一部分,因为图像 cv2.resize,它实在的形态就被扭转了,而不是在正本上改的 
# W(宽)方向为 x 轴; H(高)方向为 y 轴

1. cv2.circle(img, ( 圆心 x,圆心 y) , 半径, (255,255,255), -1)

2. cv2.rectangle(img, ( 左上角 x, 左上角 y), (右上角 x, 右上角 y), (255,255,255), -1)

3. 数组操作:img[y][x]。即先遍历行,再遍历列,合乎 c 或 python 语言中失常数组的程序 

三、PIL

# PIL 读取数据
img = Image.open('test.jpg').convert('L')

# 加一个 convert 示意读取灰度图
# W,H = img.size
img = img.resize((new_W, new_H), Image.BILINEAR)

# new_W*new_H 能够不等于 old_H*old_W,后果就是形变
# 在正本上批改的,后面必须加“img =”

四、matplotlib

from PIL import Image
img=Image.open('1.png')
img.show()

PIL 应用 open() 函数来关上图片,应用 show() 函数来显示图片。这种图片显示方式是调用操作系统自带的图片浏览器来关上图片,有些时候这种形式不太不便,因而咱们也能够应用另上一种形式,让程序来绘制图片。

from PIL import Image
img=Image.open('1.png') 

import matplotlib.pyplot as plt
plt.ion()  # 将交互操作模式关上,用来顺次关上多张图片,即上一张敞开,下一张关上的这种程序操作

plt.imshow(img)

plt.show()  # 图片展现
img.save('1.jpg')   # 图片保留

plt.axis('off')  # 去除坐标轴
plt.savefig('1.jpg')# 图片保留,会生成坐标轴,并且会改边图像的原尺寸,不好用 

这种办法尽管简单了些,但举荐应用这种办法,它应用一个 matplotlib 的库来绘制图片进行显示。matplotlib 是一个业余绘图的库,相当于 matlab 中的 plot。

另外须要留神的是, 如果想用 matplotlib 来展现或保留图片,倡议用 PIL 来读取,不倡议用 cv2

因为 PIL 读取图片的通道程序是 R、G、B,合乎 matplotlib 的要求;

而如果用 cv2 来读取,通道程序是 B、G、R,能够展现并保留,然而色彩会变得很奇怪。

五、tensor

H,W,C = tensor.shape


# 间接保留 tensor 图像
from  torchvision import utils as vutils
vutils.save_image(tensor_img, './test.jpg', normalize=True)

*、PIL 与 cv2 互相转化

# PIL 转 cv2:
img = cv2.cvtColor(np.asarray(img),cv2.COLOR_RGB2BGR)

# cv2 转 PIL:
img = Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))

退出移动版