python将RGB图像转为灰度图像

这篇具有很好参考价值的文章主要介绍了python将RGB图像转为灰度图像。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文参考论文SeAFusion模型中的图像预处理。

图像转换

RGB -> YCrCb

以图像尺寸为[1, 3, 480, 640]为例

import torch

def RGB2YCrCb(input_im):    	# 1*3*480*640
    device = torch.device("cuda:0")
    im_flat = input_im.transpose(1, 3).transpose(1, 2).reshape(-1, 3)
    # (nhw,c) (1,3,480,640)->(1,640,480,3)->(1,480,640,3)->(307200,3)
    # 这样转换是方便向量的乘加运算
    R = im_flat[:, 0]
    G = im_flat[:, 1]
    B = im_flat[:, 2]       		# 下面的就是向量的运算了
    Y = 0.299 * R + 0.587 * G + 0.114 * B
    Cr = (R - Y) * 0.713 + 0.5
    Cb = (B - Y) * 0.564 + 0.5
    Y = torch.unsqueeze(Y, 1)       # (307200,1)
    Cr = torch.unsqueeze(Cr, 1)
    Cb = torch.unsqueeze(Cb, 1)
    temp = torch.cat((Y, Cr, Cb), dim=1).to(device)
    out = (
        temp.reshape(
            list(input_im.size())[0],
            list(input_im.size())[2],
            list(input_im.size())[3],
            3,
        )   				# reshape为(1,480,640,3)
        .transpose(1, 3)    # (1,3,640,480)
        .transpose(2, 3)    # (1,3,480,640)
    )
    return out

三通道操作

from PIL import Image
import os
import torchvision.transforms as transforms

dir = r"../MSRS/Visible/train/MSRS"
file = "00002D.png"
path = os.path.join(dir,file)

# 加载并展示源图像
images_vis = Image.open(path).convert('RGB')    # 读出图像并转为RGB格式
Image._showxv(images_vis,title="可见光图像")     # 展示源图像

# 然后转换,并展示
images_vis = transforms.ToTensor()(images_vis).cuda()   # torch.Size([3, 480, 640]).这步转为tensor,并将图像数据放缩到【0,1】。
images_vis = torch.unsqueeze(images_vis,0)              # 加了个批,torch.Size([1, 3, 480, 640])
images_vis_ycrcb = RGB2YCrCb(images_vis)				# 进行转换

# 如果有需要,可以这样分离出灰度图像Y
Y = images_vis_ycrcb[:,:1]		# torch.Size([1, 1, 480, 640]),操作与Y = images_vis_ycrcb[:,0]同

单通道操作(本身就是灰度图像)

import torchvision.transforms as transform
image_vis = transform.ToTensor()(Image.open(path)).float()
# 加载图像(576,768)时,Image加载的就是(576, 768, 1),无需再unsqueeze(2)

Y = images_vis.cuda()

YCrCb -> RGB

以图像尺寸为[1, 3, 480, 640]为例

def YCrCb2RGB(input_im):    		# torch.Size([1, 3, 480, 640])
    device = torch.device("cuda:{}".format(args.gpu) if torch.cuda.is_available() else "cpu")
    im_flat = input_im.transpose(1, 3).transpose(1, 2).reshape(-1, 3)   # torch.Size([307200, 3])
    mat = torch.tensor(
        [[1.0, 1.0, 1.0], [1.403, -0.714, 0.0], [0.0, -0.344, 1.773]]
    ).to(device)
    bias = torch.tensor([0.0 / 255, -0.5, -0.5]).to(device)
    temp = (im_flat + bias).mm(mat).to(device)  #torch.Size([307200, 3])
    out = (
        temp.reshape(
            list(input_im.size())[0],
            list(input_im.size())[2],
            list(input_im.size())[3],
            3,
        )
        .transpose(1, 3)
        .transpose(2, 3)
    )
    return out  # torch.Size([1, 3, 480, 640])

三通道操作

fusion_ycrcb = torch.cat(   # 以Y通道与Cr,Cb的重叠作为YCrCb图像。
                (Y, images_vis_ycrcb[:, 1:2, :, :], images_vis_ycrcb[:, 2:, :, :]),
                dim=1,
            )   # torch.Size([1, 3, 480, 640])
fusion_image = YCrCb2RGB(fusion_ycrcb)  # torch.Size([1, 3, 480, 640]),3是RGB通道数

参考文章:
SeAFusion论文代码
numpy 与 torch中压缩、扩展维度的方法
TypeError: Cannot handle this data type: (1, 1, 28), |u1
torch.tensor的类型转换以及和numpy的转换文章来源地址https://www.toymoban.com/news/detail-650819.html

到了这里,关于python将RGB图像转为灰度图像的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 计算机图形学---常用颜色模型汇总(RGB,CMY,HSV)

    本文整理自西安交通大学软件学院祝继华老师的计算机图形学课件,请勿转载 颜色模型 :某个三维颜色空间中的一个 可见光子集 ,包含某个颜色域的所有颜色 用途:在某个颜色域内方便地指定颜色; 在某种特定环境中对颜色的特性和行为的解释方法; 没有一种颜色模型能

    2023年04月08日
    浏览(54)
  • OpenCV读取图像时按照BGR的顺序HWC排列,PyTorch按照RGB的顺序CHW排列

    在OpenCV中,读取的图片默认是HWC格式,即按照高度、宽度和通道数的顺序排列图像尺寸的格式。我们看最后一个维度是C,因此最小颗粒度是C。 例如,一张形状为256×256×3的RGB图像,在OpenCV中读取后的格式为[256, 256, 3],其中最后一个维度表示图像的通道数。在OpenCV中,可以通

    2024年02月04日
    浏览(41)
  • 图像处理(1):用Python实现彩色图像转为灰度图像的两种方法以及批量将图片转为灰度图

    用Python实现彩色图像转为灰度图像的两种方法介绍 这篇文章给大家主要介绍使用 Python 将彩色图像转为灰度图像的两种方法,以及用 Python 批量将图片转为灰度图的方法,供大家参考: 使用Python中的cv2库,它自带彩色转灰度的方法,并且代码非常简单。 先读取一张彩色图片,然

    2024年02月11日
    浏览(50)
  • Python OpenCV调整图像亮度对比度及RGB色彩

    python通过opencv库调整图像的步骤: 1. 读取图像 直接通过cv2库读取图像,可以读取jpg, png等格式 2. 调整图像亮度及对比度 OpenCV提供 convertScaleAbs 函数来调整对比度和亮度,可以直接调用该函数 如果只调整RGB颜色通道,则可以忽略此步骤 3. 分离出图片的B,R,G颜色通道 使用

    2024年02月03日
    浏览(48)
  • RGB空间中的彩色图像分割原理及其python实现

    ⭐️ 为尊重原创性 !转载请注明出处:©️ Sylvan Ding’s Blog 本文论述了基于欧式距离和曼哈顿距离的彩色图像分割算法,并用python实现了各个算法。之后将二者的优势结合,提出了改进后的曼哈顿距离算法:基于 加权曼哈顿距离 的彩色图像分割算法,在分割效果和速度上超

    2023年04月22日
    浏览(46)
  • 计算机视觉学习笔记(图像的灰度与灰度级 图像的深度 图像噪声 图像处理)

    如果把白色和黑色之间按对数关系分为若干等级,称为灰度,灰度分为256阶,0为黑色,灰度就是没有色彩,RGB色彩分量全部相等(150,150,150)就代表灰度为150. 一幅图像中不同位置的亮度是不一样的,可用f(x,y)来表示(x,y)上的亮度。由于光是一种能量形式,因此亮度是非负

    2024年02月01日
    浏览(61)
  • Python图像处理:使用OpenCV对图像进行HSV和RGB表示法的转换

    Python图像处理:使用OpenCV对图像进行HSV和RGB表示法的转换 在图像处理中,我们经常需要使用不同的颜色表示法来处理图像。在OpenCV中,我们可以使用HSV(色相、饱和度、亮度)表示法来替代标准的RGB(红、绿、蓝)表示法来处理图像。HSV表示法更为直观和易于使用,因为它将

    2024年02月06日
    浏览(77)
  • 【硬件记录】烽影青轴机械键盘的灯光控制键 如何设置?如何设置键盘 跑马灯特效?附:烽影RGB三代快捷键 | 【SCI】计算机/期刊 论文中的 Preliminaries作为目录,一般表示什么意思?

      李白:任世人厌我、妒我、恨我、爱我、笑我、哭我,我只当风曾来过。   🎯作者主页: 追光者♂🔥          🌸个人简介:   💖[1] 计算机专业硕士研究生💖   🌟[2] 2022年度博客之星人工智能领域TOP4🌟   🏅[3] 阿里云社区特邀专家博主🏅   🏆[4] CSDN-人工智能领

    2024年02月02日
    浏览(54)
  • 双目视觉——点云与RGB图像融合

       在OpenCV中针对三通道矩阵,定义的Vec类型有: cv::Vec3b 、 cv::Vec3s 、 cv::Vec3w 、 cv::Vec3d 、 cv::Vec3f 、 cv::Vec3i 6种类型。其中的数字表示通道个数,最后一位是数据类型的缩写。 cv::Vec3b :b是 uchar 类型的缩写。 cv::Vec3s :s是 short 类型的缩写。 cv::Vec3w :w是 ushort 类型的缩写

    2024年02月15日
    浏览(40)
  • 【音视频原理】图像相关概念 ③ ( RGB 色彩简介 | RGB 排列 | YUV 色彩简介 | YUV 编码好处 )

    RGB 是 计算机 中的 颜色编码方法 , 红 ( R ) / 绿 ( G ) / 蓝 ( B ) 三个颜色通道 可以设置不同的值 , 每个 通道 的 颜色值都可以取值 0 ~ 255 , 这样 三个通道 叠加 , 可以表示出 25 6 3 = 16777216 256 ^3 = 16777216 25 6 3 = 16777216 种颜色值 ; 红 ( R ) / 绿 ( G ) / 蓝 ( B ) 三个颜色通道 都取值 255

    2024年01月20日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包