1、计算机视角中的图像
在计算机中,将图像分为R、G、B三个颜色通道,也就是三基色。然后针对每个通道的图像,又将其分为若干个像素点,每个像素点的数值都在0-255之间,颜色越亮,像素值越高。
上图中三个矩阵代表三个颜色通道的像素,每个矩阵大小都是基于图像分辨率确定的,如图像分辨率为800*500,那么矩阵大小为800*500,这里图像分辨率800*500就是图像的长宽。
2、图像读取
opencv读取图像这里我们介绍两种方式,分别是imread_color彩色读取和imread_grayscale灰度读取。
步骤1:导入opencv等一些库,并原样读取图像。
import cv2#opencv读取的图像格式为BGR,而不是RGB
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline #显示图像的模板指令,仅适用于jupter notebook
img=cv2.imread("图像文件路径名")
img#jupter notebook中打印图像的像素矩阵,彩色图像包含三个颜色通道,此时为数据维度为三维,即通道、长、宽
步骤2:显示图像及图像尺寸
def cv_show(name,img):
cv2.imshow("name",img)#第一个参数为显示图像的窗口名,第二个参数为所读取的图像名
cv2.waitkey(0)#等待的时间,以毫秒为单位
cv2.destroyALLWindows()#销毁所有窗口
cv_show(image,img)
img.shape#显示图像的尺寸
步骤3:以灰度方式或者彩色方式读取图像
img=cv2.imread("图像文件路径名",cv2.IMREAD_GRAYSCALE)
img
img.shape
cv2.imwrite("保存的图像路径名",img)#图像保存
type(img)#显示图像的数据类型
img=cv2.imread("图像文件路径名",cv2.IMREAD_COLOR)
3、动态图像(视频)读取
步骤1:视频读取
vc=cv2.VideoCapture("test.mp4")
#检查是否正确打开了视频
if vc.isopened():
open,frame=vc.read()#open是个bool值,当前帧能读取则为True,frame为当前帧的图像
else:
open=False
步骤2:彩色视频转化为黑白视频
#拆解视频的每一帧图像,将每一帧转换为灰度图像,则视频就转换为黑白视频
while open:
ret,frame=vc.read()
if frame is None:
break
if ret==True:
gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#BGR图像转换为gray图像
cv2.imshow("result",gray)
if cv2.waitkey(10) & 0xFF==27:#每一帧图像的等待时间,单位为毫秒
break
vc.release()
cv2.destroyALLWindows()
4、感兴趣区域(ROI区域)
步骤1:部分图像截图
img=cv2.imread("cat.jpg")
cat=img[0:200,0:200]
cv2.imshow("cat",cat)
步骤2:颜色通道提取
b,g,r=cv2.split(img)
b
b.shape
g
g.shape
r
r.shape
img=cv2.merge((b,g,r))#重新组成BGR图像
img.shape
cur_img=img.copy()
#0代表B,1代表G,2代表R,只保留R通道的图像显示
cur_img[:,:,0]=0
cur_img[:,:,1]=0
cv2.show("R",cur_img)
5、边界填充
步骤1:边界填充方法
ps:复制法,反射法,以最边缘像素为轴的反射法,常量法
top_size,bottom_size,left_size,right_size=(50,50,50,50)#边界填充的大小
replicate=cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REPLICATE)#复制法,直接复制边缘的像素进行填充
wrap=cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_WRAP)#外包装法,bcd|abcd|abc
reflect=cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REFLECT)#反射法,对ROI区域图像像素进行复制填充,如:dcba|abcd|dcba
reflect101=cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REFLECT101)#以最边缘像素为轴的反射法,如dcb|abcd|cba
constant=cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_CONSTANT,value=0)#常量法,以常量进行像素填充
步骤2:填充效果显示
plt.subplot(231),plt.imshow(img,"gray"),plt.title("origin")
plt.subplot(232),plt.imshow(replicate,"gray"),plt.title("replicate")
plt.subplot(233),plt.imshow(wrap,"gray"),plt.title("wrap")
plt.subplot(234),plt.imshow(reflect,"gray"),plt.title("reflect")
plt.subplot(235),plt.imshow(reflect101,"gray"),plt.title("reflect101")
plt.subplot(236),plt.imshow(constant,"gray"),plt.title("constant")
plt.show()
6、数值计算
步骤1:基础计算
img_cat=cv2.imread("cat.jpg")
img_dog=cv2.imread("dog.jpt")
img_cat2=img_cat+10#原图像每个像素点都加10
img_cat[:5,:,0]
img_cat2[:5,:,0]
(img_cat+img_cat2)[:5,:,0]#因为像素点在0-255之间,超出255则用相加结果对256取余
cv2.add(img_cat,img_cat2)[:5,:,0]#结果大于255,就取255,抛弃相加结果
步骤2:图像融合
img_dog=cv2.resize(img_dog,(500,414))#图像尺寸相同才能进行融合相加
img_dog.shape
img_cat.shape
res=cv2.addWeighted(img_cat,0.4,img_dog,0.6,0)#最后一个零是偏置项
plt.imshow(res)