图像的表示与通道数问题
数字图像的基本概念
对于一幅的数字图像,我们看到的是 肉眼可见的一幅真正的图片,但是计算机看来,这副图像只是一堆亮度各异的点。一副尺寸为 M × N 的图像可以用一个 M × N 的矩阵来表示,矩阵元素的值表示这个位置上的像素的亮度,一般来说像素值越大表示该点越亮。
一般来说,灰度图用 2 维矩阵表示,彩色(多通道)图像用 3 维矩阵(M× N × 3)表示。
————————————————————————————————————————
通道数问题
单通道
描述一个像素点,如果是灰度,那么只需要一个数值来
描述它,就是单通道。灰度图和二值化的图像都是单通道图片。
2
8
2^{8}
28 =
2
2
2^{2}
22(B) *
2
3
2^{3}
23(G) *
2
3
2^{3}
23(R)
总共显示256种颜色
取值范围:0~255
- 灰度图的位深度为1*8=8.
- 二值化图像的位深度为1*1=1.
三通道
如果一个像素点,有RGB三种颜色来描述它,就是三通道。
2
24
2^{24}
224 =
2
8
2^{8}
28(B) *
2
8
2^{8}
28(G) *
2
8
2^{8}
28(R)
总共显示16777216种颜色
取值范围:0~16777215
三通道是用的最多的一种图片了。三通道图的意思是每个像素点都有3个值表示 。位深度=3*8=24.
四通道
而四通道图像,就是R、G、B加上一个A通道,表示透明度。一般叫做alpha通道,表示透明度的。
2
32
2^{32}
232 = Alpha透明度 +
2
8
2^{8}
28(B) *
2
8
2^{8}
28(G) *
2
8
2^{8}
28(R)
四通道图的意思是每个像素点都有4个值表示 ,位深度=4*8=32.
PNG是一种使用RGBA的图像格式。
二值化图像
二值图像的意思,就是每个图像当中的每个像素点,只能取0或255,其中0为黑,255为白,即非黑即白。我们将我们的彩色图片转化为灰度图并输出。
位深度为1,代表每个像素点用1位表示,即非1即0.
通道数之间的转化
# 高通道数向低通道数转化
img_gray=img.convert('L') # 将四通道或三通道图片转化为灰度图
img_white=img.convert('1') # 将四通道,三通道,灰度图转化为二值化图片
#低通道数向高通道数转化,主要涉及到灰度图向RGB的转化。
# 灰度图向三通道图的转化注意这里输出的图片依然是灰色的,但是位深度已经达到24.
img_color=img_gray.convert('RGB')
————————————————————————————————————————
接着再说说图像是如存储的,即使如何编码的:
如果是单通道图像,即灰度图,每个像素值用一个八位的二进制即可,如下图:
其中,I(ij)表示第i行第j列的亮度值。
如果是多通道图像,比如 RGB 图像,则每个像素用三个字节表示。在 OpenCV 中, RGB 图像的通道顺序为 BGR ,存储如下图 所示:
原文链接:https://blog.csdn.net/mao_hui_fei/article/details/78217049
————————————————————————————————————————
读取并展示图片
代码如下:
# 引入包
import cv2 as cv
img = cv.imread("./static/image/blur.jpg")
#Mat imread(const String& filename,int flags); 读取图片
# 第一个参数是图片地址:“\”"\\"和"/" "//" 无论正反,单双python2.7实测没影响
# 第二个参数是图片读取方式:默认正常读取,如果为0 则为 灰度图
cv.namedWindow("Image", 0)
# cv.NamedWindow( const char* name, int flags );
# 创建窗口,其实不写这行代码也可以show出来。
# 第一个参数是窗口名字,尽量使用英文命名,中文会出现乱码
# 第二个参数是窗口显示方式, 为0或cv.WINDOW_NORMAL:可以改变窗口大小,不写或cv.WINDOW_AUTOSIZE则不可改变大小
cv.imshow('Image', img)
# mshow(const string& winname, InputArray mat) 显示图片窗口
# 第一个参数:窗口名称。如果上面有NamedWindow()函数,这个名称要与它一样,不然会出现两个窗口,一个是NamedWindow的空白窗口,一个是imshow的图片窗口。
# 第二个参数:要显示的图片。
# 如果窗口是用CV_WINDOW_AUTOSIZE(默认值)标志创建的,那么显示图像原始大小。否则,将图像进行缩放以适合窗口。而imshow 函数缩放图像,取决于图像的深度
cv.waitKey(5000)
# waitKey(K) 窗口显示时间,单位:毫秒
# k=0: (也可以是小于0的数值)一直显示,键盘上按下一个数字键即会消失
# k>0:显示多少毫秒
cv.destroyAllWindows() # 删除建立的全部窗口,释放资源
结果展示: