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

原图像:
Python图像进行的变换(可视化、图像通道,裁剪)_第1张图片
处理后的图像:
Python图像进行的变换(可视化、图像通道,裁剪)_第2张图片
怎样查看图像的信息,有两种方式

from PIL import Image 
im = Image.open("1.jpg") # 图片的宽度和高度 
print("图片宽度和高度分别是{}".format(img.size))


import cv2
 
# ———— 用OPENCV读取与显示图片 ————
img=cv2.imread("1.jpg") # 打开图像,opencv默认读取图片的数据为: (高,宽,通道(B,G,R))。
                        # img的格式: numpy.array
print(img.shape) # 图像通道顺序为:BGR
cv2.imshow("image",img) # 显示图片,opencv默认读取图片的数据为: (高,宽,通道(B,G,R))。
cv2.waitKey(0)


import matplotlib.pyplot as plt
import cv2
# ———— 用PLT显示图片 ————
img=cv2.imread('/home/dell/Desktop/1.jpg') #打开图像,opencv默认读取图片的数据为: (高,宽,通道(B,G,R))。
img = img[:,:, (2, 1, 0)] # 改变图像通道顺序为:RGB
                          # PLT默认读取图片数据格式:(高,宽,通道(R,G,B))。
plt.imshow(img)
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’时
Python图像进行的变换(可视化、图像通道,裁剪)_第3张图片
有cmap='gray’时为
Python图像进行的变换(可视化、图像通道,裁剪)_第4张图片

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

Python图像进行的变换(可视化、图像通道,裁剪)_第5张图片

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

Python图像进行的变换(可视化、图像通道,裁剪)_第6张图片
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)

Python图像进行的变换(可视化、图像通道,裁剪)_第7张图片
图片的打开与显示

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

Python图像进行的变换(可视化、图像通道,裁剪)_第8张图片
这种方法虽然复杂了些,但推荐使用这种方法,它使用一个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)

将图像变为变为255-原图像

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
img2 = Image.open('1.jpg')
print(img2.size)
plt.axis('off')
plt.imshow(img2)

Python图像进行的变换(可视化、图像通道,裁剪)_第9张图片

img2=np.array(img2, dtype='float32')
print(img2[10][50][2])
a=255-img2
#plt.imshow(a)
b=a.reshape(875, 656,3)
print(b.shape)
c=np.array(b, dtype='float32')
print(c[10][50][1])

Python图像进行的变换(可视化、图像通道,裁剪)_第10张图片

你可能感兴趣的:(python)