图像的表示与通道数问题、读取并展示图片、cv2.imread(filename, flags=None)

图像的表示与通道数问题

数字图像的基本概念

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

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

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

通道数问题

单通道
俗称灰度图,每个像素点只能有一个值表示颜色,它的像素值在0到255之间,0是黑色,255是白色。灰度图是由R G B三个分量按照一定比例进行计算得到的单通道图像中间是一些不同等级的灰色。可以说灰度是黑与白之间的过渡色
描述它,就是单通道。灰度图和二值化的图像都是单通道图片。
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三颜色,每个像素点有3个字节(1个字节等于8个bit位)来表示(RGB),分别最大取值范围是0~255.
2 24 2^{24} 224 = 2 8 2^{8} 28(B) * 2 8 2^{8} 28(G) * 2 8 2^{8} 28(R)
所以RGB每个元素的取值范围是:0~255。
那么三色组合起来256 * 256 * 256 = 16777216,总共显示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

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

读取并展示图片

cv2.imread参数介绍
cv2.imread(filename, flags=None)

filename: 图像地址 如: ‘./xxx.png’

flags: 标志位, 表示读取数据的格式

  • -1:原图。保留读取图片原有的颜色通道 。 等同于IMREAD_UNCHANGED
  • 0:灰度图。 等同于IMREAD_GRAYSCALE
  • 1:彩色图。图像的透明度会被忽略,这是默认参数。 等同于IMREAD_COLOR

代码如下:

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

结果展示:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_33538887/article/details/126478280