图像的表示与通道数问题

数字图像的基本概念

对于一幅的数字图像,我们看到的是 肉眼可见的一幅真正的图片,但是计算机看来,这副图像只是一堆亮度各异的点。一副尺寸为 M × N 的图像可以用一个 M × N 的矩阵来表示,矩阵元素的值表示这个位置上的像素的亮度,一般来说像素值越大表示该点越亮。

一般来说,灰度图用 2 维矩阵表示,彩色(多通道)图像用 3 维矩阵(M× N × 3)表示。

————————————————————————————————————————

通道数问题

单通道
描述一个像素点,如果是灰度,那么只需要一个数值来
描述它,就是单通道。灰度图和二值化的图像都是单通道图片。
pytorch将单通道灰度图合并成多通道 灰度图的通道数_计算机视觉 = pytorch将单通道灰度图合并成多通道 灰度图的通道数_opencv_02(B) * pytorch将单通道灰度图合并成多通道 灰度图的通道数_python_03(G) * pytorch将单通道灰度图合并成多通道 灰度图的通道数_python_03(R)
总共显示256种颜色
取值范围:0~255

  • 灰度图的位深度为1*8=8.
  • 二值化图像的位深度为1*1=1.

三通道
如果一个像素点,有RGB三种颜色来描述它,就是三通道。
pytorch将单通道灰度图合并成多通道 灰度图的通道数_灰度图_05 = pytorch将单通道灰度图合并成多通道 灰度图的通道数_计算机视觉(B) * pytorch将单通道灰度图合并成多通道 灰度图的通道数_计算机视觉(G) * pytorch将单通道灰度图合并成多通道 灰度图的通道数_计算机视觉(R)
总共显示16777216种颜色
取值范围:0~16777215
三通道是用的最多的一种图片了。三通道图的意思是每个像素点都有3个值表示 。位深度=3*8=24.

四通道
而四通道图像,就是R、G、B加上一个A通道,表示透明度。一般叫做alpha通道,表示透明度的。
pytorch将单通道灰度图合并成多通道 灰度图的通道数_opencv_09 = Alpha透明度 + pytorch将单通道灰度图合并成多通道 灰度图的通道数_计算机视觉(B) * pytorch将单通道灰度图合并成多通道 灰度图的通道数_计算机视觉(G) * pytorch将单通道灰度图合并成多通道 灰度图的通道数_计算机视觉(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')

————————————————————————————————————————

接着再说说图像是如存储的,即使如何编码的:

如果是单通道图像,即灰度图,每个像素值用一个八位的二进制即可,如下图:

pytorch将单通道灰度图合并成多通道 灰度图的通道数_计算机视觉_13

其中,I(ij)表示第i行第j列的亮度值。

如果是多通道图像,比如 RGB 图像,则每个像素用三个字节表示。在 OpenCV 中, RGB 图像的通道顺序为 BGR ,存储如下图 所示:

pytorch将单通道灰度图合并成多通道 灰度图的通道数_python_14

 ————————————————————————————

读取并展示图片

代码如下:

# 引入包
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() # 删除建立的全部窗口,释放资源

结果展示:

pytorch将单通道灰度图合并成多通道 灰度图的通道数_opencv_15