Python图像进行的变换(图像通道,裁剪)

Python图像进行的变换(图像通道,裁剪)

1、将彩色图像转灰度图

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
img=Image.open('1.jpg')
gray=img.convert('L')
gray=np.array(gray, dtype='float32')

plt.imshow(gray,cmap='gray')
plt.axis('off')
plt.show()

原图像:
在这里插入图片描述
处理后的图像:
在这里插入图片描述
首先将图像转换为灰度,其次找出图像的通道RGB三通道,合并三通道,最终分别读取三通道

from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
img=Image.open('1.jpg')  #打开图像
gray=img.convert('L')   #转换成灰度
gray=np.array(gray, dtype='float32')
r,g,b=img.split()   #分离三通道

pic=Image.merge('RGB',(r,g,b)) #合并三通道

plt.subplot(2,3,1), plt.title('origin')
plt.imshow(img),plt.axis('off')
plt.subplot(2,3,2), plt.title('gray')
plt.imshow(gray,cmap='gray'),plt.axis('off')
plt.subplot(2,3,3), plt.title('merge')
plt.imshow(pic),plt.axis('off')

r=np.array(r, dtype='float32')
plt.subplot(2,3,4), plt.title('r')
plt.imshow(r,cmap='gray'),plt.axis('off')
g=np.array(g, dtype='float32')
plt.subplot(2,3,5), plt.title('g')
plt.imshow(g,cmap='gray'),plt.axis('off')
b=np.array(b, dtype='float32')
plt.subplot(2,3,6), plt.title('b')
plt.imshow(b,cmap='gray'),plt.axis('off')
plt.show()

无cmap='gray’时
在这里插入图片描述
有cmap='gray’时为
在这里插入图片描述

2、裁剪图片

从原图片中裁剪感兴趣区域(roi),裁剪区域由4-tuple决定,该tuple中信息为(left, upper, right, lower)。 Pillow左边系统的原点(0,0)为图片的左上角。坐标中的数字单位为像素点。

from PIL import Image
import matplotlib.pyplot as plt
img=Image.open('1.jpg')  #打开图像

plt.subplot(1,2,1), plt.title('origin')
plt.imshow(img),plt.axis('off')

box=(180,50,300,150)
x=img.crop(box)
plt.subplot(1,2,2), plt.title('x')
plt.imshow(roi)
plt.show()

在这里插入图片描述

3、几何变换

Image类有resize()、rotate()和transpose()方法进行几何变换。
1、图像的缩放和旋转

from PIL import Image
import matplotlib.pyplot as plt
img=Image.open('1.jpg')  #打开图像

a = img.resize((128, 128))
b = img.rotate(45) # 顺时针角度表示
plt.subplot(1,2,1), plt.title('resize')
plt.imshow(a)
plt.subplot(1,2,2), plt.title('rotate')
plt.imshow(b),plt.axis('off')

在这里插入图片描述
2、转换图像

from PIL import Image
import matplotlib.pyplot as plt
img=Image.open('1.jpg')  #打开图像

c = img.transpose(Image.FLIP_LEFT_RIGHT) #左右互换
d = img.transpose(Image.FLIP_TOP_BOTTOM) #上下互换
e = img.transpose(Image.ROTATE_90)  #顺时针旋转
f = img.transpose(Image.ROTATE_180)
g = img.transpose(Image.ROTATE_270)
plt.subplot(2,3,1)
plt.imshow(c)
plt.subplot(2,3,2)
plt.imshow(d)
plt.subplot(2,3,3)
plt.imshow(e)
plt.subplot(2,3,4)
plt.imshow(f)
plt.subplot(2,3,5)
plt.imshow(g)

在这里插入图片描述
图片的打开与显示

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

这种图片显示方式是调用操作系统自带的图片浏览器来打开图片,有些时候这种方式不太方便,因此我们也可以使用另上一种方式,让程序来绘制图片。

from PIL import Image
import matplotlib.pyplot as plt
img=Image.open('1.jpg')
plt.figure("dog")
plt.imshow(img)
plt.show()

在这里插入图片描述
这种方法虽然复杂了些,但推荐使用这种方法,它使用一个matplotlib的库来绘制图片进行显示。matplotlib是一个专业绘图的库,相当于matlab中的plot,可以设置多个figure,设置figure的标题,甚至可以使用subplot在一个figure中显示多张图片。matplotlib 可以直接安装
figure默认是带axis的,如果没有需要,我们可以关掉

plt.axis('off')

打开图片后,可以使用一些属性来查看图片信息,如

print (img.size)  #图片的尺寸
print (img.mode)  #图片的模式
print (img.format ) #图片的格式

(448, 448)
RGB
JPEG

图片的保存

img.save('2.png')

就一行代码,非常简单。这行代码不仅能保存图片,还是转换格式,如本例中,就由原来的jpg图片保存为了png图片。

将图像归一化至(-1,1)之间

import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
img = Image.open('1.jpg')
print (img.size)
out = img.resize((300, 300))  # 改变大小

min1 = np.min(out)
print(min1)
max1 = np.max(out)
print(max1)
range1 =max1 - min1
out2=(2*(out-min1)/range1)-1
plt.imshow(out)

猜你喜欢

转载自blog.csdn.net/weixin_40123108/article/details/83585411