代码目的
提取出的彩色图像中RGB三个通道的图并保存。
在此感谢知乎大佬,并对代码进行一丁点优化。
优化代码如下
import cv2
import os
import time
import numpy as np
def channel_extract(im,root,rows,cols,channel):
image_temp = np.zeros((rows, cols))
# for in 语句,遍历数组,但不能修改数组
for i in im:
for j in i:
pass
# 给created数据赋值
for i in range(0, rows):
for j in range(0, cols):
image_tempd[i, j] = im[i, j, channel]
# 必须加这一条语句, 否则无法正确显示图像
image_temp = image_temp.astype(np.uint8)
extract_path = os.path.join(root, "{}.jpg".format(time.time() * 10000))
cv2.imwrite(extract_path, image_temp)
return image_temp
def rgb_extract():
root = "C:/0101/2021_01_06_15"
root_0 = "C:/0101/2021_01_06_15_0"
root_1 = "C:/0101/2021_01_06_15_1"
root_2 = "C:/0101/2021_01_06_15_2"
for parent, _, fnames in os.walk(root):
for fname in fnames:
if fname.endswith("png") or fname.endswith("jpg"):
fname = os.path.join(parent, fname)
# 显示彩色图像
im = cv2.imread(fname)
cv2.imshow("RGB",im)
cv2.waitKey(1000)
cv2.destroyAllWindows()
# 显示灰度图像
gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
cv2.imshow("gray",gray)
cv2.waitKey(1000)
cv2.destroyAllWindows()
# 获得图像大小
rows, cols, _ = im.shape
# B通道:通道0图像
created_0 = channel_extract(im,root_0,rows, cols, channel=0)
cv2.imshow("channel_0", created_0)
cv2.waitKey(1000)
cv2.destroyAllWindows()
# G通道:通道1图像
created_1 = channel_extract(im,root_1,rows, cols, channel=1)
cv2.imshow("channel_1", created_1)
cv2.waitKey(1000)
cv2.destroyAllWindows()
# R通道:通道2图像
created_2 = channel_extract(im,root_2,rows, cols, channel=2)
cv2.imshow("channel_2", created_2)
cv2.waitKey(1000)
cv2.destroyAllWindows()
if __name__ == '__main__':
rgb_extract()
大佬的代码让我再次感受到图像就是矩阵,其实就是将彩色图像各个通道的像素矩阵的像素值进行导出,复制到一个新的矩阵中,并将这个矩阵显示以及保存下来。印象深刻!!!
代码进行简单说明:
root是彩色图像路径
root_0是0通道图像,即B通道图像保存路径
root_1是1通道图像,即G通道图像保存路径
root_2是2通道图像,即R通道图像保存路径
这里要明白OpenCV读取图像后是按照BGR方式排列图像矩阵的
PIL库读取图像后是按照RGB方式排列图像矩阵的
这点差别非常重要!
文章最后有微信公众号:惟CPP,欢迎关注,一起交流学习进步~