python绘图种原理介绍及应用
valid卷积
在full卷积的卷积过程中,会遇到KflipKflip靠近I的边界(K矩阵与I矩阵),就会有部分延申到I之外,这时候忽略边界,只考虑I完全覆盖KflipKflip内的值情况,这个的过程就是valid卷积。一个高为H1,宽为W1的矩阵I与高为H2,宽为W2的矩阵K,在H1大于等于H2,W1大于等于W2的情况下,valid卷积的结果就是一个(H1-H2+1)*(W-W+1)的矩阵CvalidCvalid。
same卷积
无论是full卷积还是valid卷积都不会得到正好的尺寸,要么比原尺寸大要么比原尺寸小,这时就需要same卷积来解决这个问题。若想得到宽和高都正好的矩阵我们首先需要给KflipKflip一个锚点,将锚点放在(循环)图像矩阵的(r,c)处,((r,c)在矩阵之内),将对应位置的元素逐个相乘,最终将所有的积进行求和作为输出图像矩阵在(r,c)处的输出值。这个过程称为same卷积。
OpenCv函数copyMakeBorder的参数表
参数 | 解释 |
---|---|
src | 输入矩阵 |
dst | 输出矩阵 |
top | 上侧扩充的行数 |
bottom | 下侧扩充的行数 |
left | 左侧扩充的行数 |
right | 右侧扩充的行数 |
borderType | 边界扩充的类型 |
value | border Type= BORDER_CONSTANT事的常数 |
其中borderType有多种类型,比如:BORDER_REPLICATE(边界复制)、BORDER_CONSTANT(常数扩充)、BORDER_REFLECT(反射扩充)等。 | |
在使用Python进行卷积操作时用到包Scipy,其中有关的操作函数为convolve2d(in1,in2,mode='full',boundary='fill',fillvalue=0) | |
参数 | 解释 |
-- | -- |
in1 | 输入数组 |
in2 | 输入数组,代表K(卷积算子) |
mode | 卷积类型,也就是以上提到的三种类型:full,valid,same |
boundary | 边界填充:fill\wrap\symm |
fillvalue | 当boundary='fill'时,设置边界填充的值,默认为0 |
在这里需要注意的是当model为same时卷积算子的锚点位置由不同尺寸而不同,假设K(卷积算子)的宽和高分别为W、H。 | |
W和H的值 | 锚点位置 |
-- | -- |
均为奇数 | 默认为中心点 |
H为偶数、W为奇数 | (H-1,(W-1)/2) |
H为奇数,W为偶数 | ((H-1)/2,W-1) |
均为偶数 | (H-1,W-1) |
代码实现:
import numpy as np from scipy import signal if __name__ == "__main__": I = np.array([[1,2],[3,4],np.float32]) #I的高和宽 H1,W1 = I.shape[:2] #卷积算子 k = np.array([[-1,-2],[2,1],np.float32]) #K的宽和高 H2,W2 = k.shape[:2] #计算full卷积 c_full = signal.convolve2d(I,k,mode='full') #设定锚点 r,c = 0,0 #根据锚点来从full卷积中截取same卷积 c_same= c_full[H2-r-1:H1-r-1,W2-c-1:W1+W2-c-1]
图像数字化:
我们平时使用PS或者其它图像处理的软件打开一个要处理的图像,当我们将图像放大得足够大的时候我们会发现很多个灰度程度不同的小方格,每个方格就相当于一个像素,水平方向的方格数代表这个图像的像素宽度(通常在图像的属性信息中可以查看到图像以像素为单位的宽度),同样垂直方向上的方格的个数代表图像的像素高度。计算机会将每个方格化为一个数值- “位深度”,是将一个方格化为[0,255]之间的一个uchar类型的数字,用256个数来表示灰度的深浅(0代表黑色,256代表白色),值越小越灰,反之越大越接近白色,就越亮。总之对于计算机数字图像的处理就是对图像矩阵的操作。
利用imread的Python API ,可以将灰度图像转化成都ndarry类型,实例如下:
import cv2 import numpy as np #读入原始图像 img=cv2.imread('j1.jpg',cv2.IMREAD_GRAYSCALE) #灰度化处理 cv2.imshow("1",img); cv2.waitKey(0)
在OpenCV3.X版本中对应的参数是:
参数 | OpenCV3.x的解释 |
---|---|
filename | 图像的文件名,可以包含路径 |
flags | IMREAD_COLOR: 彩色图像;IMREAD_GRAYSCALE:灰色图像;IMREAD_ANYCOLOR:任意图像 |
我使用的编辑工具是Anaconda2的Spyder编辑器,正常情况下会有一定的代码提示,当忘记完整的参数时可以根据提示来补全。 | |
对于图像的灰度化也可以使用cv2.cvtColor()函数进行颜色转换 例如图像灰度化: | |
` | |
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) |
彩色图像数字化
对彩色图像的理解和对灰色图像的理解上相似,灰色图像的每一个像素都是有一个数组量化的,二彩色图像的每一个像素都是由三个数字组成的向量量化的,最常用的就是用R,G,B三个分量来量化的,这三个元素的值分别代表三种基色:Red、Green、Blue的亮度。假设每种基色的数值量化成m=2的n次方,如同8为灰度图像一样,将灰度量化成2的8次方=256个数。RGB图像的红绿蓝三个通道的图像都是一张8位图,因此颜色的总数是256的3次方=16777216,如(0,0,0)代表黑色,(255,255,255)代表白色,(255,0,0)代表红色,(0,0,255)代表蓝色。
下面将RGB彩色图转换为三维的ndarray,代码如下:
import cv2 import numpy as np import sys #读入原始图像 image=cv2.imread('j1.jpg',cv2.IMREAD_COLOR) #得到三个颜色通道 b = image[:,:,0] g = image[:,:,1] r = image[:,:,2] #显示三个颜色通道 cv2.imshow('b',b) cv2.imshow('g',g) cv2.imshow('r',r) cv2.waitKey(0) cv2.destroyAllWindows()
cv2.cvtColor()函数应用变化
cv2.cvtColor()函数能够实现多种变化。首先,图像处理中有多种色彩空间,例如 RGB、HLS、HSV、HSB、YCrCb、CIE XYZ、CIE Lab 等。下面对平常用到的颜色空间进行简单介绍:
- RGB (Red 红色,Green 绿色,Blue 蓝色),可用于表示大部分颜色,也是图像处理中最基本、最常用、面向硬件的颜色空间,是一种光混合的体系.
- LAB (L 亮度,A 绿色到红色的分量, B 蓝色到黄色的分量)颜色空间由一个亮度通道和两个颜色通道组成的。LAB 相较于RGB与CMYK等颜色空间更符合人类视觉,也更容易调整:想要调节亮度,就调节L 通道,想要调节只色彩平衡就分别调 A 和 B。L 越大,亮度越高(L为0时是黑色),A 和 B 为0时都代表灰色,在实际应用中常常将颜色通道的范围[-100, +100]或[-128, 127]之间。
- HSI (H 色相,S 饱和度,I 亮度) HSI颜色模式中的色调使用颜色类别表示,饱和度与颜色的白光光亮亮度刚好成反比,代表灰色与色调的比例,亮度是颜色的相对明暗程度.
下面是一个综合运用的实例:from matplotlib import pyplot as plt import cv2 img_BGR = cv2.imread('j1.jpg') # BGR plt.subplot(3,3,1) plt.imshow(img_BGR);plt.axis('off');plt.title('BGR') img_RGB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2RGB) plt.subplot(3,3,2) plt.imshow(img_RGB);plt.axis('off');plt.title('RGB') img_GRAY = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2GRAY) plt.subplot(3,3,3); plt.imshow(img_GRAY);plt.axis('off');plt.title('GRAY') img_HSV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HSV) plt.subplot(3,3,4) plt.imshow(img_HSV);plt.axis('off');plt.title('HSV') img_YcrCb = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YCrCb) plt.subplot(3,3,5) plt.imshow(img_YcrCb);plt.axis('off');plt.title('YcrCb') img_HLS = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HLS) plt.subplot(3,3,6) plt.imshow(img_HLS);plt.axis('off');plt.title('HLS') img_XYZ = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2XYZ) plt.subplot(3,3,7) plt.imshow(img_XYZ);plt.axis('off');plt.title('XYZ') img_LAB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2LAB) plt.subplot(3,3,8) plt.imshow(img_LAB);plt.axis('off');plt.title('LAB') img_YUV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YUV) plt.subplot(3,3,9) plt.imshow(img_YUV);plt.axis('off');plt.title('YUV') plt.show()