(11条消息) Opencv 读取灰度图像会识别为3通道问题

最近初接触图像cv,一切都是从零开始因此遇到了许多问题,故在此记录遇到的问题方便提醒自己也方便后来人不再困惑。


场景:

我们都知道灰度图或者红外图都是单通道图片,而彩色图片是三通道图片。但是当我们用img.shape读取灰度图/红外图片的时候返回的却是三通道结果:

  1. import cv2

  2. img_path = r'灰度图'
  3. img = cv2.imread(img_path)
  4. print(img.shape)

  5. # 如果我将图片灰度处理
  6. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  7. print(gray.shape)

  8. """
  9. img.shape返回的结果:
  10. (201, 190, 3)
  11. gray.shape返回的结果:
  12. (201, 190)
  13. """

问题在于我们直接用opencv 读取图片时似乎都是三通道图片,只有在灰度处理后才回显示单通道。针对这一问题我查了些资料:

opencv在默认情况下会读取3个通道的图像,如果是灰度图/红外图片则会将其图层复制三次(BGR缺省,B==G==R),因此读出来的图片是三通道。


解决:

如果我们想一开始就按照单通道读取灰度图片/红外图片的话,可以在imread()函数中加入相关参数(cv2.IMREAD_GRAYSCALE):

  1. import cv2

  2. img_path = r'灰度图'
  3. img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
  4. print(img.shape)

  5. """
  6. img.shape返回的结果:
  7. (201, 190)
  8. """

 这样就会直接按照单通道的方式读取。


需求:

现有一堆彩色图与灰度图混合文件,要求将其分类。

 

  1. // 借助PIL库, mode为L时即为8位灰度图
  2. Image.mode == 'L'

  3. """
  4. 拓展
  5. 1. mode==1: 位图,像素1位
  6. 2. mode=='L': 灰度图,像素8位
  7. 3. mode=='I': 像素Int32
  8. 4. mode=='F': 像素float32
  9. 5. mode=='P': 8位,映射为其他模式
  10. 6. mode=='RGB': 真色彩,3通道
  11. 7. mode=='RGBA': 4通道,加透明度
  12. 8. mode=='CMYK': 印刷,4通道
  13. 9. mode=='YCbCr': 亮色分离,3通道

  14. """

在不考虑效率的情况下,我用这种方式处理:

  1. // 不推荐这个方法,推荐用上面的方法。这里感谢评论区“SNOWsama”的指教。
  2. def handle_img(file_path):
  3. for img_path in sorted(glob.glob(file_path + "/*.jpg")):
  4. print("正在处理:" , img_path)
  5. img = Image.open(img_path)
  6. pix = img.convert('RGB')
  7. width = img.size[0]
  8. height = img.size[1]
  9. ir = 0
  10. hd = 0
  11. for x in range(width):
  12. for y in range(height):
  13. r,g,b = pix.getpixel((x,y))
  14. r = int(r)
  15. g = int(g)
  16. b = int(b)
  17. if r==g==b:
  18. ir += 1
  19. else:
  20. hd += 1
  21. if ir > hd:
  22. # 此图片为灰度图
  23. else:
  24. # 此图片为彩色图

注: 此小脚本在我的场景下实现了图片分类,但是尚未大范围测试。该方法只是起到抛砖引玉的作用启发观看者。

(0)

相关推荐

  • 【CV】基于阈值处理的图像分割算法!

    图像处理 Author:louwill Machine Learning Lab 基于阈值的图像分割因其处理直观.实现简单和计算速度快,是一种更为常用的传统图像分割算法.本文基于图像灰度阈值处理的基本 ...

  • python+opencv图像处理(九)

    图像缩放 下雨了... 图像是可以放大和缩小的,简称图像缩放. 不过不管放大还是缩小,都可以用resize. 1.缩小 如下图,左图为原图,中间图为将左图行和列均缩小一半的图,右图为缩小到四分之一的图 ...

  • 【从零学习OpenCV 4】图像直方图绘制

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • OpenCV学习(2021.10.10)

    OpenCV学习(2021.10.10)

  • 好玩的OpenCV:图像操作的基本知识(2)

    1.1随机生成像素 生成与test.jpg相同大小图片,但是像素是随机生成的. import numpy as np import cv2raw_image = cv2.imread('test图片路 ...

  • CV之FE:基于TF进行FE——去除异常(被损坏)图像 和单通道图像

    CV之FE:基于TF进行FE--去除异常(被损坏)图像 和单通道图像 输出结果 去除了异常(被损坏)图像 .单通道图像 设计思路 1. 部分代码实现 import tensorflow as tf f ...

  • 一个简单方法识别毛玻璃、高斯模糊

    作者:晟沚 前  言 本文主要推荐一种简单的方法识别带有毛玻璃.高斯模糊等效果的图片. 01 毛玻璃效果 毛玻璃效果的原理,即遍历每一个像素,随机选取这个像素周围的某一个像素,替换当前像素.可以使用o ...

  • 常见的图像处理技术

    重磅干货,第一时间送达 本期文章中,让我们一起来学习以下内容. 通过PIL和OpenCV来使用一些常见的图像处理技术,例如将RGB图像转换为灰度图像.旋转图像.对图像进行消噪.检测图像中的边缘以及裁剪 ...

  • OpenCV-Python学习教程.2

    如果你用Linux得设备,可能会用到这里来看有没有设备被安全挂载.因为没有一个图形化的页面来方便的查看. 子Linux不是太好使 # 获取视频帧的宽w = fcap.get(cv2.CAP_PROP_ ...

  • python+opencv图像处理(八)

    无所谓,谁会爱上谁... 无所谓,不能天天更... 只要是,不要一直断... -----------------------------------我是可爱的分割线 图像平移的意思就是将图像沿着x轴. ...

  • 【OpenCV 4开发详解】直方图应用

    直方图不仅能够表示图像像素的统计特性,应用统计的直方图结果也可以增强图像的对比度,在图像中寻找相似区域等.本节中将重点介绍如果通过调整直方图分布提高图像的对比度.利用直方图反向投影寻找相同区域以及将图 ...

  • 基于OpenCV的图像强度操作

    重磅干货,第一时间送达 01. 什么是图像强度操作 更改任何通道中的像素值 对图像的数学运算 亮度变化 对比度变化 伽玛操纵 直方图均衡 图像预处理中的滤波等增强 使用OpenCV加载图像 impor ...

  • OpenCV-Python学习教程.3

    对于CV2的库来说,一个彩色的照片通道的排序是,返回的图像格式的通道并不是按R.G.B排列的,而是按B.G.R顺序排列的. b,g,r=cv2.split(image)image=cv2.merge( ...

  • 【AI基础】OpenCV,PIL,Skimage你pick谁

    汤兴旺 就读于吉林大学汽车工程学院,计算机视觉爱好者,言有三弟子 作者 | 汤兴旺 编辑 | 汤兴旺/言有三 如何对图像进行处理是深度学习图像处理的基础,我们常常需要对图像进行读取.保存.缩放.裁剪. ...

  • 【从零学习OpenCV 4】中值滤波

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 使用Python+OpenCV进行数据增广方法综述(附代码演练)

    原创 磐怼怼 深度学习与计算机视觉 1周前 数据扩充是一种增加数据集多样性的技术,无需收集更多的真实数据,但仍然有助于提高模型的准确性和防止模型过度拟合.在这篇文章中,你将学习使用Python和Ope ...

  • 【从零学习OpenCV 4】颜色模型与转换

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • CV:基于人工智能算法实现人脸口罩的实时检测(结合无人机可,实现实时警告提醒)

    CV:基于人工智能算法实现人脸口罩的实时检测(结合无人机可,实现实时警告提醒) 输出结果 实现代码 参考文章:CV:基于人工智能算法实现人脸口罩的实时检测(结合无人机可,实现实时警告提醒)--代码 更 ...

  • OpenCV-Python图像的缩放、翻转和旋转

    重磅干货,第一时间送达 图像的缩放 opencv中对图像进行放缩[1]有两种方式可以实现,一种是使用指定尺寸放缩:一种是使用缩放比例放缩. 指定尺寸 cv2.resize(image, (1920, ...

  • Python+opencv 图像处理(五)

        灰度反转 "你说的黑是什么黑......"有一首歌的歌词是这样的. 在图像中,黑是什么? 很简单,就是0嘛. 因为在数字图像里,用0表示黑. 那么,"你说的白是什 ...

  • 好玩的OpenCV:图片操作的基本知识(1)

    图像基本知识 图像是由像素组成的,而像素实际上就是带有坐标位置和颜色信息的点.我们把图片想象成由若干行,若干列的点组成的, 现实中有RGB颜色系统,我们可以把图中任意一点(位置在第m行,第n列)的点A ...