前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenCV-Python学习教程.4

OpenCV-Python学习教程.4

作者头像
云深无际
发布2021-04-14 10:46:15
4550
发布2021-04-14 10:46:15
举报
文章被收录于专栏:云深之无迹云深之无迹
代码语言:javascript
复制
import cv2

image = cv2.imread('./img/111.jpg')

size = image.shape

w = size[1]  # 宽度

h = size[0]  # 高度

s = size[2]

print(size)
print(type(size))
print(w)
print(h)
print(s)
print(type(s))

如何获得一个照片的长宽和通道信息

shape是一个元组的类型

我们可以读取出来

代码语言:javascript
复制
from PIL import Image
im = Image.open('./img/111.jpg')
print(im.getbands())

老实讲,到现在都没有写出来可以获得图像的深度的代码

waitKey(int delay=0)函数,函数功能:

  1. 按下键的时候,焦点要落在窗口上,不能落在cmd窗口上;
  2. 必须在有窗口显示的情况下,waitKey才有作用,否则无效。比如调用cv.waitKey(0),如果此时没有活动的窗口,该函数立刻返回-1;
  3. waitKey()函数的功能是不断刷新图像,频率时间为delay,单位为ms,延时delay > 0 函数返回值为按下的键的ASCII码值,超时则返回-1。;
  4. 返回值为当前键盘按键值;
  5. 如果delay<0,等待时间无限长,返回值为按键值;
  6. 经常程序里面出现 if( waitKey(10) >= 0 ) 是指10ms内按任意键进入此 if 块;

图像的深度:

图像中像素点占得bit位数,就是图像的深度,比如:

二值图像:图像的像素点不是0 就是1 (图像不是黑色就是白色),图像像素点占的位数就是 1 位,图像的深度就是1,也称作位图。

灰度图像:图像的像素点位于0-255之间,(0:全黑,255代表:全白,在0-255之间插入了255个等级的灰度)。2^8=255,图像的深度是8。

以此类推,我们把计算机中存储单个像素点所用的 bit 位称为图像的深度。

图像的通道:

有了图像深度的概念,我们知道如果是24位的图像,则这个像素点的颜色的取值范围是:从0到2^24。这个范围特别大,如果我们知道了某点的像素值怎么判断像素点的颜色呢?

我们知道 RGB是基本的三原色,如果我们用8位代表一种颜色,每种颜色最大是255,这样每个像素点的颜色值的范围就是(0-255,0-255,0-255)。这样图像的通道就是3。

灰度图的图像存储模型

灰度图像像素点的存储就是对应的原图从左到右,从上到下,依次排列,每个点的值就是就是像素点的值,每个点的地址就是像素像素点的地址。

RGB图的图像存储模型

RGB彩色图像和灰度图相比,每个像素点都有3个通道。每个通道占的内存空间都是8位。在内存中,RGB 图像的存储是以二维数组的形式。

学习图像的存储就是为了理解图像中像素点的存储情况,有助于我们对每个像素点的操作。

注意:我们对图像像素的遍历其实对每个像素点中通道的遍历。

我们接着来进行颜色空间的压缩:

什么是颜色空间的颜色呢?

我们知道,对于3通道的深度是8的 RGB 图像,一共可以有255^3中颜色,如此庞大的颜色对我们的处理很不方便,我们可以对图像的像素进行量化。减小图像的颜色种类,同样也可以达到同样的效果。比如我们把图像的像素减少8倍,则每个通道只能有256/8=32中颜色,这样的话,原来图像的0-7像素点对应量化后的0,原来的图像的8-15对应量化后的图像的1,......原来图像中的248-255对应量化后的32。这样就能实现对图像的压缩。

那么这种办法在编程怎么实现?

很简答的,直接利用C/C++中 int 变量的 “/” 运算,这样的话,像素(0-7)/ 8 =0。同理依次可以得到压缩后像素值。

上面的分析知道了,图像的存储就是以二维数组的形式,如果取一个二维数组中元素的话。常规的方法就是先确定行,然后再确定列。这样就能把这个元素取出来。

OpenCV中Mat类中定义的指针,可以获取某一行的地址,然后确定列数就可以获取我们所需要的地址。

Mat 类中有:Mat.ptr<uchar>(int i=0) 获取像素矩阵的指针,i 是从第零行开始的。这块有点像二维数据的存储那样,二维数组可以当做是若干个一维指针,如果知道了每个行的第一个元素就能遍历这个行所有数据。

具体的程序代码:

修改:

内层循环可以用指针实现移动到下一列:

代码语言:javascript
复制
*pt++=(*pt/n)*n+n/2;
代码语言:javascript
复制
https://blog.csdn.net/u013355826/article/details/64905921
本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-04-02,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 云深之无迹 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com