关于图像的基本操作中,对图像RGB通道的拆分与合并,本文介绍两种方式,第一种是使用opencv-python,即cv2,第二种使用Pillow即PIL模块。这里要注意的是,Pillow处理图像时,通道顺序为正常的RGB模式,但是opencv处理图像,通道顺序比较特殊,为BGR,所以这里要注意。
1.opencv-python进行图像通道的拆分和合并
代码示例
import cv2
import random
import matplotlib.pyplot as plt
def change_channels(img):
'''使用opencv-python改变图像通道数'''
# 分离原来图像的通道
b,g,r = cv2.split(img)
#随机打乱顺序
channel_list = [r, g, b]
random.shuffle(channel_list)
# 合并通道
new_image = cv2.merge(channel_list)
return new_image
if __name__ == '__main__':
image = cv2.imread('../myimages/6.jpg')
# 调用改变通道函数
new_image = change_channels(image)
# 将新的图片写在本地
cv2.imwrite('new_image6.jpg', new_image)
# 也可以在窗口查看效果
plt.subplot(121), plt.imshow(image), plt.title('Input')
plt.subplot(122), plt.imshow(new_image), plt.title('Output')
plt.show()
运行结果
image.png2.Pillow进行图像通道的拆分和合并
代码示例
import random
import matplotlib.pyplot as plt
from PIL import Image
'''使用PIL 进行图像通道变换'''
def change_channels(img):
'''改变图像通道数'''
# 读取原来图像的通道
r,g,b = img.split()
channel_list = [r,g,b]
# 随机打乱顺序后
random.shuffle(channel_list)
# 进行通道合并
new_image = Image.merge('RGB',tuple(channel_list))
return new_image
if __name__ == '__main__':
image = Image.open('../myimages/4.jpg')
new_image = change_channels(image)
new_image.save('new_image4.jpg')
# 也可以在窗口查看效果
plt.subplot(121), plt.imshow(image), plt.title('Input')
plt.subplot(122), plt.imshow(new_image), plt.title('Output')
plt.show()
运行结果
image.png3.opencv-python+Pillow进行图像通道的拆分和合并(涉及两种图片格式的转换)
代码示例
import cv2
import random
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
def change_channels(img):
'''opencv+PIL 改变图像通道数'''
# 分离原来图像的通道
# 使用PIL进行通道分离和合并,先将openCV格式转换为PIL.Image
pil_image = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
# 分离rgb通道
r, g, b = pil_image.split()
channel_list = [r, g, b]
# 随机打乱顺序后
random.shuffle(channel_list)
# 进行通道合并
new_pil_image = Image.merge('RGB', tuple(channel_list))
# PIL.Image 格式转换为openCV格式
new_image = cv2.cvtColor(np.asarray(new_pil_image), cv2.COLOR_RGB2BGR)
return new_image
if __name__ == '__main__':
image = cv2.imread('../myimages/7.jpg')
# 调用改变通道函数
new_image = change_channels(image)
# 将新的图片写在本地
cv2.imwrite('new_image7.jpg', new_image)
# 也可以在窗口查看效果
plt.subplot(121), plt.imshow(image), plt.title('Input')
plt.subplot(122), plt.imshow(new_image), plt.title('Output')
plt.show()
网友评论