1.图像的基本概念:
- 图像包括 分辨率: 图像分辨率指图像中存储的信息量,是每英寸图像内有多少个像素点
- 分辨率越高,图像越清晰。例如1920*1080。1920表示水平分辨率,1080表示垂直分辨率
- 图像分辨率和像素的关系是:分辨率=画面水平方向的像素值 * 画面垂直方向的像素值
- 深度:存储每个像素所用到的位数(bit)
- 位图(2值图)。每个像素用0或1表示,所以只用一个有效位。
- 灰度图。每个像素用0-255表示,0表示最黑,255表示最亮。因为2^8=256,所以需要8个有效位表示,也就是一个字节表示。
- RGB图。RGB图像同样也是用8位,一个字节表示。那和灰度图有什么不同呢?灰度图的通道只有1个,但是RGB有3个,也就是相当于3个灰度图的叠加。那怎么显示颜色呢。有调色板,也就是每个像素存储的只是调色板的位置信息,调色板是各种颜色。
- 通道:通道表示每个点能存放多少个数,例如RGB彩色图像中每个像素点存放三个值,即3通道的,灰度图就是1个数,也就是1通道。
- python 对 image的参数读取
import cv2
image=cv2.imread("D:/shape.bmp")
print(image.shape[0])
print(image.shape[1])
print(image.shape[2])
image_copy=image[:2] //复制相同分辨率和通道的图片
结果
300
200
3
其中shape.bmp是一张水平200像素,垂直300像素的彩色图
2. 图像的基本操作
1 通道拆分和合并:cv.spilt()和cv.merge()
import numpy as np;
import cv2; #导入opencv模块
image=cv2.imread("/home/zje/Pictures/lena.jpeg");#读取要处理的图片
B,G,R = cv2.split(image); #分离出图片的B,R,G颜色通道
cv2.imshow("RED",R); #显示三通道的值都为R值时d图片
cv2.imshow("GREEN",G); #显示三通道的值都为G值时d图片
cv2.imshow("BLUE",B); #显示三通道的值都为B值时d图片
cv2.waitKey(0); #不让程序突然结束
import numpy as np;
import cv2; #导入opencv模块
image=cv2.imread("/home/zje/Pictures/lena.jpeg");#读取要处理的图片
B,G,R = cv2.split(image); #分离出图片的B,R,G颜色通道
zeros = np.zeros(image.shape[:2],dtype="uint8");#创建与image相同大小的零矩阵
cv2.imshow("BLUE",cv2.merge([B,zeros,zeros]));#显示 (B,0,0)图像
cv2.imshow("GREEN",cv2.merge([zeros,G,zeros]));#显示(0,G,0)图像
cv2.imshow("RED",cv2.merge([zeros,zeros,R]));#显示(0,0,R)图像
cv2.waitKey(0);
2.图像的融合:cv.addWeighted
addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=None):
src1 – first input array. 【第一张图片】
alpha – weight of the first array elements. 【第一张图片的权重】
src2 – second input array of the same size and channel number as src1. 【与第一张大小和通道数相同的图片】
beta – weight of the second array elements. 【第二张图片的权重】
gamma – scalar added to each sum.【加到每个总和上的标量,相当于调亮度】
dst – output array that has the same size and number of channels as the input arrays.【输出,python中可以直接将dst放在前面作为输出】
3 图像的裁剪和缩放:image[x:y,w:m] cv.resize
- image[x:y,w:m]截取image的[x:y,w:m]的像素点
- cv.resize:缩小或者放大函数至某一个大小
- 下边的函数裁剪后然后进行缩放,变成256*128大小的图片。
img = cv.resize(img[:300, 10:280], (256, 128))
4 图像的灰度转换:cv.cvtColor
- cvtColor(src,dst,code,dstCn) ===> (原图像,输出图像,color转化代码,输出通道)
cvtColor(img, img, COLOR_BGR2Luv);
或者:
img = cv.cvtColor(img, cv.COLOR_RGB2GRAY)
将图片由RGB转化为灰度图像
5 图像的二值化: cv.threshold
- src:源图像,可以为8位的灰度图,也可以为32位的彩色图像。(两者由区别)
dst:输出图像
thresh:阈值(当高于阈值的时候,像素点直接为1,否则为0)
maxval:dst图像中最大值
type:阈值类型 - threshold_type=CV_THRESH_BINARY:如果 src(x,y)>threshold ,dst(x,y) = max_value; 否则,dst(x,y)=0; threshold_type=CV_THRESH_BINARY_INV:如果 src(x,y)>threshold,dst(x,y) = 0; 否则,dst(x,y) = max_value. threshold_type=CV_THRESH_TRUNC:如果 src(x,y)>threshold,dst(x,y) = max_value; 否则dst(x,y) = src(x,y). threshold_type=CV_THRESH_TOZERO:如果src(x,y)>threshold,dst(x,y) = src(x,y) ; 否则 dst(x,y) = 0。 threshold_type=CV_THRESH_TOZERO_INV:如果 src(x,y)>threshold,dst(x,y) = 0 ; 否则dst(x,y) = src(x,y).
et, drawn_label = cv.threshold(drawn_label, 50, 255, cv.THRESH_BINARY)
6 遍历图像的每一个像素
for x in range(img.shape[0]): # 图片的高
for y in range(img.shape[1]): # 图片的宽
px = img[x, y]
if px[0]>120 and px[1]>120 and px[2]>120:
px[0] = 130
px[1] = 130
px[2] = 130