opencv——图像的基本操作

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一瞬にして失う

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值