Record_ 07_使用opencv对彩色图像中各个通道图像提取,显示和保存

知乎大佬代码链接

代码目的

提取出的彩色图像中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,欢迎关注,一起交流学习进步~

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值