cv2 imread()函数[通俗易懂]

Reason    这两天学习OpenCV-Python时,也就是cv2库,读取图像时不时出现和预料之外的结果。于是作者从源头来考究一下cv2.imread(filename,flags)Result这里参考文章cv2.imread(filename,flags)cv2.imread(filename,flags)参数:filepath:读入imge的完整路径flags:标志位,{cv2.IMREAD_COLOR,cv2.IMREAD_GRAYSC

大家好,又见面了,我是你们的朋友全栈君。

Reason

        这两天学习OpenCV-Python时,也就是cv2库,读取图像时不时出现和预料之外的结果。于是作者从源头来考究一下cv2.imread(filename, flags)

Result

这里参考文章cv2.imread(filename, flags)
cv2.imread(filename, flags)
参数:
filepath:读入imge的完整路径
flags:标志位,{cv2.IMREAD_COLOR,cv2.IMREAD_GRAYSCALE,cv2.IMREAD_UNCHANGED}
cv2.IMREAD_COLOR:默认参数,读入一副彩色图片,忽略alpha通道,可用1作为实参替代
cv2.IMREAD_GRAYSCALE:读入灰度图片,可用0作为实参替代
cv2.IMREAD_UNCHANGED:顾名思义,读入完整图片,包括alpha通道,可用-1作为实参替代
PS:alpha通道,又称A通道,是一个8位的灰度通道,该通道用256级灰度来记录图像中的透明度复信息,定义透明、不透明和半透明区域,其中黑表示全透明,白表示不透明,灰表示半透明

Experiemt

    这里用到的两个img:MyPic.png,MyPicGray.png


cv2 imread()函数[通俗易懂]MyPic.png:500×500, 24bpp

cv2 imread()函数[通俗易懂]MyPicGray.png:500×500, 8bpp

        当然需要先导入cv2,并接下来会使用的一个自定义fun()

import cv2
 # ouput img properties 
def funOutputImgProperties(img):
    print("properties:shape:{},size:{},dtype:{}".format(img.shape,img.size,img.dtype))

        首先对彩色图MyPic测试:imread分别以三种flag读取MyPic,并输出图像参数:
代码如下:

# 3 channels img loads
# 读入完整图片,含alpha通道
img3ChaCom = cv2.imread('MyPic.png', cv2.IMREAD_UNCHANGED)
cv2.imshow('IMREAD_UNCHANGED+Color',img3ChaCom)
cv2.waitKey()
funOutputImgProperties(img3ChaCom)

# 读入彩色图片,忽略alpha通道
img3Cha=cv2.imread('MyPic.png',cv2.IMREAD_COLOR)
cv2.imshow('IMREAD_COLOR+Color', img3Cha)
cv2.waitKey()
funOutputImgProperties(img3Cha)

#彩色图片按,灰度图片读入
img3ChaGray=cv2.imread('MyPic.png',cv2.IMREAD_GRAYSCALE)
cv2.imshow('IMREAD_GRAYSCALE+Color', img3ChaGray)
cv2.waitKey()
funOutputImgProperties(img3ChaGray)

输出信息:
    窗口图像


cv2 imread()函数[通俗易懂]

cv2 imread()函数[通俗易懂]

cv2 imread()函数[通俗易懂]

    控制台输出:

properties:shape:(500, 500, 3),size:750000,dtype:uint8
properties:shape:(500, 500, 3),size:750000,dtype:uint8
properties:shape:(500, 500),size:250000,dtype:uint8

        和作者预想的一样,IMREAD_UNCHANGED和IMREAD_COLOR标志位的img读取自然是3 channels彩图,而使用IMREAD_GRAYSCALE标志位时,imread将彩色图像直接读取为灰色,B\G\R的三通道变成了单通道。图片像素改变:500X500X3->500X500X1
        接下来,考察灰度图MyPicGray:imread分别以三种flag读取MyPic,并输出图像参数:
代码如下:

# 1 channel img loads
# 读入完整图片,含alpha通道
img1ChaCom = cv2.imread('MyPicGray.png', cv2.IMREAD_UNCHANGED)
cv2.imshow('IMREAD_UNCHANGED+Gray', img1ChaCom)
cv2.waitKey()
funOutputImgProperties(img1ChaCom)

# 读入彩色图片,忽略alpha通道
img1ChaColor = cv2.imread('MyPicGray.png', cv2.IMREAD_COLOR)
cv2.imshow('IMREAD_COLOR+Gray', img1ChaColor)
cv2.waitKey()
funOutputImgProperties(img1ChaColor)

# 彩色图片按,灰度图片读入
img1Cha = cv2.imread('MyPicGray.png', cv2.IMREAD_GRAYSCALE)
cv2.imshow('IMREAD_GRAYSCALE+Gray', img1Cha)
cv2.waitKey()
funOutputImgProperties(img1Cha)

输出信息:
    窗口图像


cv2 imread()函数[通俗易懂]

cv2 imread()函数[通俗易懂]

cv2 imread()函数[通俗易懂]

    控制台输出:

properties:shape:(500, 500),size:250000,dtype:uint8
properties:shape:(500, 500, 3),size:750000,dtype:uint8
properties:shape:(500, 500),size:250000,dtype:uint8

        结合输出图像和控制台输出我们可以看到,三个imgshow的输出都是展现的灰度图,但是imread的flag为IMREAD_COLOR时,图像实际上时三通道的彩色图。
        进一步的,我们直接输出IMREAD_COLOR+Gray和IMREAD_GRAYSCALE+Gray的像素矩阵。可以看到IMREAD_COLOR+Gray确实时三通道的[ [ [ ] ] ]像素矩阵,IMREAD_GRAYSCALE+Gray是[ [ ] ]。

[[[246 246 246]
[246 246 246]
[246 246 246]
...
[246 246 246]
[246 246 246]
[246 246 246]]
[[246 246 246]
[246 246 246]
[246 246 246]
...
[246 246 246]
[246 246 246]
[246 246 246]]
[[246 246 246]
[246 246 246]
[246 246 246]
...
[246 246 246]
[246 246 246]
[246 246 246]]
...
[[246 246 246]
[246 246 246]
[246 246 246]
...
[246 246 246]
[246 246 246]
[246 246 246]]
[[246 246 246]
[246 246 246]
[246 246 246]
...
[246 246 246]
[246 246 246]
[246 246 246]]
[[246 246 246]
[246 246 246]
[246 246 246]
...
[246 246 246]
[246 246 246]
[246 246 246]]]
[[246 246 246 ... 246 246 246]
[246 246 246 ... 246 246 246]
[246 246 246 ... 246 246 246]
...
[246 246 246 ... 246 246 246]
[246 246 246 ... 246 246 246]
[246 246 246 ... 246 246 246]]

Conclusion

        收获:除了深入了解imread函数的参数,更多的是知道3 channels colored img可以直接读取为1 channel grayscale img;而1 channel grayscale img也可以读取为3 channels colored img。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/129610.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 《欧美剧集观看最佳索引》(US SHOWS GUIDE) 【2005-12-27 转verycd】[通俗易懂]

    《欧美剧集观看最佳索引》(US SHOWS GUIDE) 【2005-12-27 转verycd】[通俗易懂]原文地址http://bbs.verycd.com/topics/230847/中文名称:欧美剧集观看最佳索引英文名称:USTVSHOWSGUIDE别名:欧美剧集观看最佳索引版本:2005-2006导演:USTVSHOWSGUIDE演员:USTVSHOWSGUIDE简介:欧美剧集观看最佳索引2005-2006USTVSHOWSGUIDE2005-2006(作者:

  • c++ 优先级队列_低优先级队列要等几局

    c++ 优先级队列_低优先级队列要等几局作者有话说:本来兴致勃勃的准备写一篇优先级队列的总结,但查资料时发现一篇写的不错的博文,偷个懒!!!!!!!!!!!转载大神的就ok了。https://www.cnblogs.com/xzxl/p/7266404.html一、相关定义优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素。但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而…

  • vue与jquery的区别_vue 3

    vue与jquery的区别_vue 31.jquery介绍:想必大家都用过jquery吧,这个曾经也是现在依然最流行的web前端js库,可是现在无论是国内还是国外他的使用率正在渐渐被其他的js库所代替,随着浏览器厂商对HTML5规范统一遵循以及ECMA6在浏览器端的实现,jquery的使用率将会越来越低2.vue介绍:vue是一个兴起的前端js库,是一个精简的MVVM。从技术角度讲,Vue.js专注于MVVM模型的ViewM…

    2022年10月16日
  • Django之URL(路由系统)用法

    路由系统路由系统概念路由系统的格式django项目中的url规则定义放在project的urls.py目录下,默认如下:url()函数可以传递4个参数,其中2个是必须的:regex和vie

  • 书包网小说多线程爬虫[通俗易懂]

    书包网小说多线程爬虫[通俗易懂]书包网是个很好的小说网站,提供了小说txt下载,并且网站后端高并发,不用担心随便抓一下把网站抓崩了既然如此,何不拿来练手爬虫项目呢。直接上代码把,此多线程爬虫支持爬取各种这样类似的网站,关键需要网站支持高并发,否则分分钟崩了。毕竟5分钟一本18mb的小说,属于超级快的那种了fromlxmlimportetreeimportrequestsfromthreadi…

  • 解决numpy.core._exceptions.UFuncTypeError: ufunc ‘add‘ did not contain a loop with signature matchin问题

    解决numpy.core._exceptions.UFuncTypeError: ufunc ‘add‘ did not contain a loop with signature matchin问题

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号