Opencv 读取灰度图像会识别为3通道问题
最近初接触图像cv,一切都是从零开始因此遇到了许多问题,故在此记录遇到的问题方便提醒自己也方便后来人不再困惑。
场景:
我们都知道灰度图或者红外图都是单通道图片,而彩色图片是三通道图片。但是当我们用img.shape读取灰度图/红外图片的时候返回的却是三通道结果:
import cv2img_path = r'灰度图'
img = cv2.imread(img_path)
print(img.shape) # 如果我将图片灰度处理
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
print(gray.shape)"""
img.shape返回的结果:
(201, 190, 3)
gray.shape返回的结果:
(201, 190)
"""
问题在于我们直接用opencv 读取图片时似乎都是三通道图片,只有在灰度处理后才回显示单通道。针对这一问题我查了些资料:
opencv在默认情况下会读取3个通道的图像,如果是灰度图/红外图片则会将其图层复制三次(BGR缺省,B==G==R),因此读出来的图片是三通道。
解决:
如果我们想一开始就按照单通道读取灰度图片/红外图片的话,可以在imread()函数中加入相关参数(cv2.IMREAD_GRAYSCALE):
import cv2img_path = r'灰度图'
img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
print(img.shape)"""
img.shape返回的结果:
(201, 190)
"""
这样就会直接按照单通道的方式读取。
需求:
现有一堆彩色图与灰度图混合文件,要求将其分类。
// 借助PIL库, mode为L时即为8位灰度图
Image.mode == 'L' """
拓展
1. mode==1: 位图,像素1位
2. mode=='L': 灰度图,像素8位
3. mode=='I': 像素Int32
4. mode=='F': 像素float32
5. mode=='P': 8位,映射为其他模式
6. mode=='RGB': 真色彩,3通道
7. mode=='RGBA': 4通道,加透明度
8. mode=='CMYK': 印刷,4通道
9. mode=='YCbCr': 亮色分离,3通道"""
在不考虑效率的情况下,我用这种方式处理:
// 不推荐这个方法,推荐用上面的方法。这里感谢评论区“SNOWsama”的指教。
def handle_img(file_path):for img_path in sorted(glob.glob(file_path + "/*.jpg")):print("正在处理:" , img_path)img = Image.open(img_path)pix = img.convert('RGB')width = img.size[0]height = img.size[1]ir = 0hd = 0for x in range(width):for y in range(height):r,g,b = pix.getpixel((x,y))r = int(r)g = int(g)b = int(b)if r==g==b:ir += 1else:hd += 1if ir > hd:# 此图片为灰度图else:# 此图片为彩色图
注: 此小脚本在我的场景下实现了图片分类,但是尚未大范围测试。该方法只是起到抛砖引玉的作用启发观看者。
Opencv 读取灰度图像会识别为3通道问题相关推荐
- OpenCV读取灰度图像
在写OpenCV程序时,发现通过image = imread("the path of a image");的方式读入的灰度图片都是3通道,并且每个通道都完全相同,可以通过打印im ...
- python 读取jpg文件是yuv_python怎么使用opencv读取的图片数据送入模型?
@fuyangchenghu @zhengchuang 处理方法1:转换模型时候+--insert_op_conf=aipp_nv12.cfg这个参数,使用AclImage读取图片 处理方法2:转换模 ...
- python将图像转换为8位单通道_Python OpenCV读取16位单通道图像并转换为8位灰度图显示...
语义.实例分割数据集的标注图像以及一些深度图像等都是由单通道16位整型图像存储的,我们通常需要读取这种图像并显示出来,由于OpenCV一般只能够对8位图像进行显示,也就是像素范围在0-255的图像,而 ...
- 【jpg和png区别】PIL和opencv读取、显示图片+归一化+transpose变换通道
文章目录 1 图片说明 2 两种读取方式+显示 3 numpy中transpose的使用 4 数据类型转换+归一化 5 PIL.Image读取png和jpg有什么区别 1 图片说明 两张图片格式不同, ...
- opencv读取四通道图像
用opencv读取图像,默认情况下是读取BGR三通道,alpha通道是被舍弃的,这在处理一些透明图的时候会出错. img = cv2.imread(image_path,-1) img = cv2.i ...
- Python+OpenCv实现AI人脸识别身份认证系统(2)——人脸数据采集、存储
原 Python+OpenCv实现AI人脸识别身份认证系统(2)--人脸数据采集.存储 2019年07月02日 08:47:52 不脱发的程序猿 阅读数 602更多 所属专栏: 人脸识别身份认证系统设 ...
- opencv学习—简单车牌识别操作(python)
opencv学习-简单车牌识别操作(python) 目录 opencv学习-简单车牌识别操作(python) 利用opencv进行车牌识别的详细流程如下: 1.车牌检测 2.分割车牌号并进行识别 3. ...
- 【OpenCV 例程200篇】11. 图像通道的拆分(cv2.split)
[OpenCV 例程200篇]11. 图像通道的拆分(cv2.split) 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更 ...
- Python基于OpenCV的人脸表情识别系统[源码&部署教程]
1.项目背景 人脸表情识别是模式识别中一个非常重要却十分复杂的课题.首先对计算机人脸表情识别技术的研究背景及发展历程作了简单回顾.然后对近期人脸表情识别的方法进行了分类综述.通过对各种识别方法的分析与 ...
最新文章
- .asmx支持post请求或者get请求调用(WebService 因 URL 意外地以 结束,请求格式无法识别 的解决方法)...
- 查看Flink的Job Graph时的问题
- Java中equals、==和hashcode()
- Intellij IDEA 新建一个EJB工程(三)
- SQL Server 权限的分类
- mysql query cache 关闭_为什么要关闭MySQL query cache-Fun言
- java中事务的管理
- 同源策略——浏览器安全卫士
- Swagger注解-@ApiImplicitParams 和 @ApiImplicitParam
- HALCON-FUZZY检测用于开关引脚测量
- 小巧实用的节拍器软件FineMetronome介绍 原创
- Kotlin 中文文档
- stata 空间杜宾模型_一文读懂空间计量及stata应用(二)(附lr检验、动态空间面板杜宾/滞后模型dofile等)...
- IE主页被篡改,修改“Internet 选项”也无法解决时的解决方法
- vue登录模板1-科技透明登录框与登录页
- windows11补充——Insider Preview 10.0.22623.1028 (ni_release)
- css里banner是什么,div+css banner的问题
- 广州穗雅医院健康汇:为什么口腔溃疡会反反复复?
- 几款软件,内有很多人求而不得的破解版TeamViewer
- 双官能交联剂点击试剂DBCO-PEG4-DBCO