OpenCV视频学习笔记(2)-图像基本操作

二、图像基本操作

图像在计算机眼中,是由许多个像素点组成。
Opencv中图像的基本操作:
1.数据读取-图像
cv2.IMREAD_COLOR:彩色图像
Cv2.IMREAD_GRAYSCALE:灰度图像
读取彩色图像代码:
import cv2 #opencv读取的格式是BGR,不是RGB
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

img=cv2.imread(‘D:/graduate/cat.jpg’)

Img

输出:
array([[[ 54, 39, 30],
[ 53, 38, 29],
[ 54, 39, 30],
…,
[ 48, 34, 22],
[ 50, 36, 24],
[ 50, 36, 24]],

   [[ 50,  35,  26],
    [ 49,  34,  25],
    [ 51,  36,  27],
    ...,
    [ 50,  36,  24],
    [ 51,  37,  25],
    [ 51,  37,  25]],

   [[ 50,  35,  26],
    [ 50,  35,  26],
    [ 52,  37,  28],
    ...,
    [ 51,  37,  25],
    [ 53,  39,  27],
    [ 53,  39,  27]],

   ...,

   [[132, 107,  97],
    [132, 107,  97],
    [132, 107,  97],
    ...,
    [117,  99,  88],
    [116,  98,  87],
    [116,  98,  87]],

   [[145, 120, 110],
    [146, 121, 111],
    [147, 122, 112],
    ...,
    [115,  97,  86],
    [115,  97,  86],
    [114,  96,  85]],

   [[150, 125, 115],
    [151, 126, 116],
    [152, 127, 117],
    ...,
    [115,  97,  86],
    [115,  97,  86],
    [114,  96,  85]]], dtype=uint8)

显示图像:
#图像的显示,也可以创建多个窗口
cv2.imshow(‘image’,img)#显示刚刚的cat.jpg
#等待时间,毫秒级,0表示任意键终止
cv2.waitKey(0)
cv2.destoryAllWindows()

#定义成一个函数
def cv_show(name,img)
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destoryAllWindows()
可调用属性:
img.shape
(h, w, c)
(375, 500, 3)

读取灰度图像,读取过程中要指定第二参数:
img=cv2.imread(‘D:/graduate/cat.jpg’,cv2.IMREAD_GRAYSCALE)
Img
显示:
array([[ 38, 37, 38, …, 32, 34, 34], [ 34, 33, 35, …, 34, 35, 35], [ 34, 34, 36, …, 35, 37, 37], …, [107, 107, 107, …, 98, 97, 97], [120, 121, 122, …, 96, 96, 95], [125, 126, 127, …, 96, 96, 95]], dtype=uint8)

img.shape
显示:
(h, w)
(375, 500)

图像保存:
#保存
cv2.imwrite(‘mycat.png’,img)
查看底层格式:
type(img)
显示:
numpy.ndarray
计算图片像素点的个数:
img.size
显示:
187500
查看数据类型:
img.dtype
显示:
dtype(‘uint8’)

2.数据读取-视频
cv2.VideoCapture可以捕获摄像头,用数字来控制不同的设备,例如0,1
如果是视频文件,直接指定好路径即可
读取视频:
vc=cv2.VideoCapture(‘D:/graduate/test.mp4’)
检查是否读取到了:
#检查是否打开正确
if vc.isOpened():
open, frame=vc.read()
else:
open=False
一帧一帧的读取并处理,转换成灰度图:
while open:
ret, frame=vc.read()
if frame is None:
break
if retTrue:
#每一帧图像读取进来之后把图像转换为灰度图像,然后显示出来
gray=cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow(‘result’,gray)
if cv2.waitKey(10)&0xFF
27:#waitKey的值可以自己指定

        break

vc.release()
cv2.destoryAllWindows()

截取部分图像数据
首先将图像读取进来,然后自己设置索引(切片),选择自己感兴趣的区域。
img=cv2.imread(‘D:/graduate/cat.jpg’)
cat=img[0:50,0:200]
cv_show(‘cat’,cat)

颜色通道提取
b,g,r=cv2.split(img)
b
显示:
array([[ 54, 53, 54, …, 48, 50, 50], [ 50, 49, 51, …, 50, 51, 51], [ 50, 50, 52, …, 51, 53, 53], …, [132, 132, 132, …, 117, 116, 116], [145, 146, 147, …, 115, 115, 114], [150, 151, 152, …, 115, 115, 114]], dtype=uint8)

b.shape
显示:
(375, 500)

g
显示:
array([[ 39, 38, 39, …, 34, 36, 36], [ 35, 34, 36, …, 36, 37, 37], [ 35, 35, 37, …, 37, 39, 39], …, [107, 107, 107, …, 99, 98, 98], [120, 121, 122, …, 97, 97, 96], [125, 126, 127, …, 97, 97, 96]], dtype=uint8)

g.shape
显示:
(375, 500)

r
显示:
array([[ 30, 29, 30, …, 22, 24, 24], [ 26, 25, 27, …, 24, 25, 25], [ 26, 26, 28, …, 25, 27, 27], …, [ 97, 97, 97, …, 88, 87, 87], [110, 111, 112, …, 86, 86, 85], [115, 116, 117, …, 86, 86, 85]], dtype=uint8)

r.shape
显示:
(375, 500)

分别处理完之后还可以合并还原:
img=cv2.merge((b,g,r))
img.shape
显示:
(375, 500, 3)

只保留R通道:
只保留R
cur_img=img.copy()
cur_img[:,:,0]=0
cur_img[:,:,1]=0
cv_show(‘R’,cur_img)

只保留G
cur_img=img.copy()
cur_img[:,:,0]=0
cur_img[:,:,2]=0
cv_show(‘R’,cur_img)

只保留B
cur_img=img.copy()
cur_img[:,:,1]=0
cur_img[:,:,2]=0
cv_show(‘R’,cur_img)

边界填充
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)
reflect=cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REFLECT)
reflect101=cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REFLECT_101)
wrap=cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_WRAP)
constant=cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_CONSTANT,value=0)

import matplotlib.pyplot as plt
plt.subplot(231),plt.imshow(img,‘gray’),plt.title(‘ORIGINAL’)
plt.subplot(232),plt.imshow(replicate,‘gray’),plt.title(‘REPLTCATE’)
plt.subplot(233),plt.imshow(reflect,‘gray’),plt.title(‘REFLECT’)
plt.subplot(234),plt.imshow(reflect101,‘gray’),plt.title(‘REFLECT_101’)
plt.subplot(235),plt.imshow(wrap,‘gray’),plt.title(‘WRAP’)
plt.subplot(236),plt.imshow(constant,‘gray’),plt.title(‘CONSTANT’)

Opencv中基本的数值计算
img_cat=cv2.imread(‘D:/graduate/cat.jpg’)
img_dog=cv2.imread(‘D:/graduate/dog.jpg’)

img_cat2=img_cat+10 #在每一个像素点上加10
img_cat[:5,:,0] #表示只打印其中的一部分
显示:
array([[54, 53, 54, …, 48, 50, 50], [50, 49, 51, …, 50, 51, 51], [50, 50, 52, …, 51, 53, 53], [56, 55, 56, …, 50, 53, 54], [58, 58, 58, …, 49, 52, 53]], dtype=uint8)

img_cat2[:5,:,0]
显示:
array([[64, 63, 64, …, 58, 60, 60], [60, 59, 61, …, 60, 61, 61], [60, 60, 62, …, 61, 63, 63], [66, 65, 66, …, 60, 63, 64], [68, 68, 68, …, 59, 62, 63]], dtype=uint8)

相加操作,相当于%256,因为像素值的取值范围是0-255 ,为了防止越界
(img_cat+img_cat2)[:5,:,0]、
显示:
array([[118, 116, 118, …, 106, 110, 110], [110, 108, 112, …, 110, 112, 112], [110, 110, 114, …, 112, 116, 116], [122, 120, 122, …, 110, 116, 118], [126, 126, 126, …, 108, 114, 116]], dtype=uint8)

add操作,越界取最大255,没越界取自身
cv2.add(img_cat,img_cat2)[:5,:,0]
显示:
array([[118, 116, 118, …, 106, 110, 110], [110, 108, 112, …, 110, 112, 112], [110, 110, 114, …, 112, 116, 116], [122, 120, 122, …, 110, 116, 118], [126, 126, 126, …, 108, 114, 116]], dtype=uint8)

图像融合
img_cat+img_dog
报错:
ValueError Traceback (most recent call last) in ----> 1 img_cat+img_dog ValueError: operands could not be broadcast together with shapes (375,500,3) (208,335,3)
因为shape值不同,没办法执行数值计算操作,将狗的shape值变成跟猫的一样的。
img_cat.shape
显示:
(375, 500, 3)
img_dog=cv2.resize(img_dog,(500,375))
img_dog.shape
显示:
(375, 500, 3)
resize操作可以改变狗那张图片的shape值。
添加权重项:
res=cv2.addWeighted(img_cat,0.4,img_dog,0.6,0)
分别表示(x1, w1, x2, w2 b)
plt.imshow(res)
融合结果:

对图像进行比例倍的放缩
res=cv2.resize(img,(0,0),fx=1,fy=1)
plt.imshow(res)
显示:

res=cv2.resize(img,(0,0),fx=3,fy=4)
plt.imshow(res)
显示:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值