4.1.1 通道数与像素深度
4.1.1 通道数与像素深度
在介绍图像格式之前,首先介绍图像的通道数和像素深度这两个概念。在计算机中通常使用一组像素表示一个图像,像素的位置对应的就是图像的坐标。对于灰度图像,一个像素使用一个8位的数字就可以表示对应的黑白程度,这里的通道数就是1,像素深度就是8位。对于常见的彩色图像,就需要分别使用rgb三个8位数字表示一个像素的颜色,分别表示该像素对应的红绿蓝颜色程度,这里的通道数就是3,像素深度就是8位。有的彩色图像甚至需要3个24位的数字表示其彩色程度,这时的通道数就是3,像素深度就是24位。部分图像使用bgr的顺序表示颜色程度,与rgb相比只在排列顺序上有所不同。计算机中图像的表示方法如图4-1所示。
深度学习平台在表示图像时也存在着差异:cwh格式中c代表通道维度,w表示宽,h表示高,一个典型的mnist图像,图像的形状为(1,28,28);whc格式中c代表通道维度,w表示宽,h表示高,一个典型的mnist图像,图像的形状为(28,28,1)。
图4-1 计算机中图像的表示方法
以opencv为例介绍图像的通道数和像素深度的概念,对应的代码路径为:
https://github.com/duoergun0729/adversarial_examples/blob/master/code/4-demo.ipynb
使用opencv读取图像,由于我们的开发环境是ipython,因此无法直接使用opencv展示图片,需要使用matplotlib帮助展现。opencv默认格式为bgr,因此需要转换成rgb格式后再展现。图4-2为猪的彩色图像。
import cv2
from matplotlib import pyplot as plt
img=cv2.imread("../picture/pig.jpg")
show_img = cv2.cvtcolor(img, cv2.color_bgr2rgb)
plt.imshow(show_img)
plt.show()
打印原始图像,形状为(300,300,3)
print(img.shape)
(300, 300, 3)
图4-2 猪的图像(彩色图像)
通过设置cv2.color_bgr2gray参数,把图像转换成灰度图像来展示,灰度图像见图4-3。
img=cv2.imread("../picture/pig.jpg")
show_img=cv2.cvtcolor(img, cv2.color_bgr2gray)
plt.imshow(show_img,cmap=plt.cm.gray)
plt.show()
图4-3 猪的图像(灰度图像)
打印原始图像,形状为(300,300),通道数为1。
print(img.shape)
(300, 300)
还有一类特殊的图像,只有黑色和白色,称为二值图,像素深度是1位(见图4-4)。
img=cv2.imread("../picture/pig.jpg")
show_img=cv2.cvtcolor(img, cv2.color_bgr2gray)
ret, thresh = cv2.threshold(show_img, 220, 255,cv2.thresh_binary)
plt.imshow(thresh,cmap=plt.cm.gray)
plt.show()
图4-4 猪的图像(二值图像)
其中核心函数是cv2.threshold,通过它可以把超过阈值的像素点设置为新值,对应的函数原型为:
cv2.threshold(src, x, y, methods)
其中各个参数的含义如下:
? src指原图像,该原图像为灰度图。
? x指用来对像素值进行分类的阈值。
? y指当像素值高于阈值时应该被赋予的新的像素值。
? methods指不同的阈值方法,这些方法包括:cv2.thresh_binary、cv2.thresh_binary_inv、cv2.thresh_trunc、cv2.thresh_tozero、cv2.thresh_tozero_inv。
在介绍图像格式之前,首先介绍图像的通道数和像素深度这两个概念。在计算机中通常使用一组像素表示一个图像,像素的位置对应的就是图像的坐标。对于灰度图像,一个像素使用一个8位的数字就可以表示对应的黑白程度,这里的通道数就是1,像素深度就是8位。对于常见的彩色图像,就需要分别使用rgb三个8位数字表示一个像素的颜色,分别表示该像素对应的红绿蓝颜色程度,这里的通道数就是3,像素深度就是8位。有的彩色图像甚至需要3个24位的数字表示其彩色程度,这时的通道数就是3,像素深度就是24位。部分图像使用bgr的顺序表示颜色程度,与rgb相比只在排列顺序上有所不同。计算机中图像的表示方法如图4-1所示。
深度学习平台在表示图像时也存在着差异:cwh格式中c代表通道维度,w表示宽,h表示高,一个典型的mnist图像,图像的形状为(1,28,28);whc格式中c代表通道维度,w表示宽,h表示高,一个典型的mnist图像,图像的形状为(28,28,1)。
图4-1 计算机中图像的表示方法
以opencv为例介绍图像的通道数和像素深度的概念,对应的代码路径为:
https://github.com/duoergun0729/adversarial_examples/blob/master/code/4-demo.ipynb
使用opencv读取图像,由于我们的开发环境是ipython,因此无法直接使用opencv展示图片,需要使用matplotlib帮助展现。opencv默认格式为bgr,因此需要转换成rgb格式后再展现。图4-2为猪的彩色图像。
import cv2
from matplotlib import pyplot as plt
img=cv2.imread("../picture/pig.jpg")
show_img = cv2.cvtcolor(img, cv2.color_bgr2rgb)
plt.imshow(show_img)
plt.show()
打印原始图像,形状为(300,300,3)
print(img.shape)
(300, 300, 3)
图4-2 猪的图像(彩色图像)
通过设置cv2.color_bgr2gray参数,把图像转换成灰度图像来展示,灰度图像见图4-3。
img=cv2.imread("../picture/pig.jpg")
show_img=cv2.cvtcolor(img, cv2.color_bgr2gray)
plt.imshow(show_img,cmap=plt.cm.gray)
plt.show()
图4-3 猪的图像(灰度图像)
打印原始图像,形状为(300,300),通道数为1。
print(img.shape)
(300, 300)
还有一类特殊的图像,只有黑色和白色,称为二值图,像素深度是1位(见图4-4)。
img=cv2.imread("../picture/pig.jpg")
show_img=cv2.cvtcolor(img, cv2.color_bgr2gray)
ret, thresh = cv2.threshold(show_img, 220, 255,cv2.thresh_binary)
plt.imshow(thresh,cmap=plt.cm.gray)
plt.show()
图4-4 猪的图像(二值图像)
其中核心函数是cv2.threshold,通过它可以把超过阈值的像素点设置为新值,对应的函数原型为:
cv2.threshold(src, x, y, methods)
其中各个参数的含义如下:
? src指原图像,该原图像为灰度图。
? x指用来对像素值进行分类的阈值。
? y指当像素值高于阈值时应该被赋予的新的像素值。
? methods指不同的阈值方法,这些方法包括:cv2.thresh_binary、cv2.thresh_binary_inv、cv2.thresh_trunc、cv2.thresh_tozero、cv2.thresh_tozero_inv。