OpenCV-Python学习教程.4
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是一个元组的类型
我们可以读取出来
from PIL import Image
im = Image.open('./img/111.jpg')
print(im.getbands())
老实讲,到现在都没有写出来可以获得图像的深度的代码
waitKey(int delay=0)函数,函数功能:
按下键的时候,焦点要落在窗口上,不能落在cmd窗口上;
必须在有窗口显示的情况下,waitKey才有作用,否则无效。比如调用cv.waitKey(0),如果此时没有活动的窗口,该函数立刻返回-1;
waitKey()函数的功能是不断刷新图像,频率时间为delay,单位为ms,延时delay > 0 函数返回值为按下的键的ASCII码值,超时则返回-1。;
返回值为当前键盘按键值;
如果delay<0,等待时间无限长,返回值为按键值;
经常程序里面出现 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 是从第零行开始的。这块有点像二维数据的存储那样,二维数组可以当做是若干个一维指针,如果知道了每个行的第一个元素就能遍历这个行所有数据。
具体的程序代码:
修改:
内层循环可以用指针实现移动到下一列:
*pt++=(*pt/n)*n+n/2;
https://blog.csdn.net/u013355826/article/details/64905921