一、安装
pip install opencv-python
二、导入
import cv2
三、长,宽,通道
1、通道介绍
通道包含用于构成其他颜色的基础色彩,三种基本颜色是红绿蓝。
在通道的每一个像素点上,都有[0,255]之间的整数值,这些书值代表了“该通道上颜色的灰度”。
在图像的语言中:“灰度”就是明亮程度。数字越接近255,就代表颜色明亮程度越高,越接近通道本身的颜色。数字越接近0,就代表颜色的明亮程度越弱,也就是越接近黑色。 例如:白色RGB(255,255,255) 黑色RGB(0,0,0) 如果红色通道是黑色的,说明红色对图片几乎没有贡献。如果绿色通道比较明亮,说明绿色对图片贡献比较多。
在图像的矩阵中,我们可以使用索引找出任意像素的三个通道上的颜色的明度,例如,对于第0行、第0列的样本而言,可以看到一个三列的矩阵,这三列就分别代表着红色、绿色、蓝色的像素值。当三个值都不为0时,这个像素在三个通道上都有颜色。相对应的,最纯的红色会显示为(255,0,0),最纯的蓝色就会显示为(0,0,255),绿色可以此类推。当像素值为(0,0,0)时,这个像素点就为黑色,当像素值为(255,255,255), 像素点就为白色。通道上像素的灰度,也就是矩阵中的值,几乎100%决定了图像会呈现出什么样子。
饱和度:颜色是否鲜艳。
2、通道类型
在图像的世界中有许多通道”类型,就和计算机世界有许多编码类型-样,较为常见的通道有以下几种:
(1)灰度通道
灰度在计算机视觉中是指“明暗程度”,而不是指“灰色”。因而灰度通道也不是指图像是灰色的通道,而是只有一种颜色的通道。同理,灰度图像是只有一个通道的图像。所以RGB通道中的任意一个通道单独拿出来之后, 都可以用灰度(明暗) 来显示。就像我们在Fashion-MNIST数据集中所见到的,灰度图像的shape最后一列为1, 索引出来的值中只有一个数字,这个数字就是这种唯一颜色的明度。当你看见图像的通道数为1, 无论可视化之后图像显示什么视觉颜色,它都只是表示单一颜色的明度而已。(没有人怀疑过为什么fashion-MNIST中的图绘制出来是黄绿色的吗?你现在了解,其实蓝绿色也只是明度的一种表示)。
(2)RGB色彩空间
数字世界最常见的彩色通道,分别表示红、绿、蓝三种电子成像的基本颜色。
(3)CMYK色彩空间
用于彩色打印机成像的通道,由青色(Cyan) 、品红(Magenta) 、黄色(Yellow) 和黑色(Black) 构成,因此是四维通道,在图像结构中会显示为(高度,宽度,4)。
(4)HSV (或HSL)色彩空间
HSV通道是为人们描述和解释颜色创建的,H代表色相,S代表饱和度,V代表亮度。 以上三种空间可以自由切换(会产生数据损失),在OpenCV中也有支持切换的函数可以调用。在计算机视觉中,我们可能遇见各种通道类型的图片,当我们需要对图像进行特定操作时,我们必须了解这些通道并了解如何在他们之间进行转换。
(5)RGBA色彩空间
拥有四维通道,分别是(红色,绿色,蓝色,透明度alpha)。透明度alpha的取值范围在0-1之间。当-一个像素的RGB显示为(0 ,255,0)时,则说明这个像素里是明度最高的绿色,但加H透明度之后,色彩就会变得透明”。RGBA可以提供更丰富的色彩样式,让图像的色彩变得更加绚丽。
3、OpenCV令像素变化来改变图像
(1)默认读取
import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('D:/My life/girl.jpeg')
img.shape
(562, 1000, 3)
plt.figure(dpi=150)
plt.imshow(img)
plt.axis('off');
结果发现颜色有点阴间:
(2)切换为RGB
openCV默认读取后的图像通道是BGR,红蓝搞反了。因此我们需要将图像的通道转化成RGB。
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
plt.figure(dpi=150)
plt.imshow(img)
plt.axis('off');
img.dtype
dtype(‘uint8’)
a = np.array([0,1,255],dtype="uint8")
a
array([ 0, 1, 255], dtype=uint8)
不能直接进行线性变换:
a + 10 ,a - 10
(array([10, 11, 9], dtype=uint8), array([246, 247, 245], dtype=uint8))
应该把img变成浮点型:
img = img*1.0
b = np.array([280,-3,250])
np.clip(b,0,255)
array([255, 0, 250])
img = img/255
(3)调亮画面
img_ = np.clip(img + 100/255,0,1)
plt.figure(dpi = 100)
plt.imshow(img_)
plt.axis('off');
(4)调暗画面
img_ = np.clip(img - 100/255,0,1)
plt.figure(dpi = 100)
plt.imshow(img_)
plt.axis('off');
(5)让画面更鲜艳
img_ = np.clip(img*2,0,1)
plt.figure(dpi = 100)
plt.imshow(img_)
plt.axis('off');
(6)调整饱和度
注:读取文件路径时不要有中文,不要有空格。尽量改成/,不要用r’’
img = cv2.imread('D:/My life/girl.jpeg')
"""
openCV默认读取后的图像通道是BGR,为了调整饱和度,直接将通道转化为HSV
"""
img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
h,s,v = cv2.split(img_hsv)
"""
#这里分解出的是uint8,要在uint8上进行数值操作则必须先更换为浮点数。openCV只能处理uint8
h += np.clip(s*1.0 + 100,0, 255).astype("uint8") #色相
s += np.clip(s*1.0 + 100,0, 255).astype("uint8") #饱和度
v += np.clip(s*1.0 + 100,0, 255).astype("uint8") #亮度
"""
final_hsv = cv2.merge((h, s, v))
"""
为了绘图,这里是转回RGB,而不是BGR
"""
img_s = cv2.cvtColor(final_hsv, cv2.COLOR_HSV2RGB)
plt.figure(dpi=100)
plt.imshow(img_s)
plt.axis('off');
在掌握了一些浅层图像原理之后,就可以通过改变像素值来改变图像的模样。这再次证明了,通道上像素的灰度,也就是张量中的值几乎100%决定了图像会呈现出什么样子。因此,只要给与[0,255]之间的值,令其结构形似一张图像(高,宽,3),我们甚至可以自己“瞎编”出一张图像来,所以任意矩阵都可以被以图像的方式进行可视化。
值得注意的是,由于灰度的存在,图像是可以被表示成二元函数。通常写作f(x,y)或f(i,j)。在这个函数中,函数的两个自变量是图像的宽度与高度,函数值就是该通道上的灰度。
pic = np.random.randint(0,255,size=(300,300,3))
plt.figure(dpi=100)
plt.imshow(pic)
plt.axis('off');
|