计算机视觉-OpenCV(一)

计算机视觉-OpenCV(一),第1张

一、计算机眼中的图像

彩色图分为R、G、B三个通道,右侧矩阵每个像素点数字代表亮度。

灰度图只有一个通道。

每个像素点取值0-255,数值越大,亮度越高。

二、环境包
import cv2   #OpenCV读取格式是BGR
import matplotlib.pyplot as plt
import numpy as np
#魔法语句
%matplotlib inline

img=cv2.imread('pic.jpg')
三、图片 *** 作 3.1查看img
img

array([[[15, 197, 44],
        [55, 197, 244],
        [156, 198, 25],
        ...,
        [11, 178, 35],
        [105, 172, 229],
        [02, 169, 226]],

       [[150, 192, 39],
        [11, 193, 240],
        [152, 194, 241],
        ...,
        [118, 47, 204],
        [118, 47, 204],
        [118, 47, 204]],

       [[145, 187, 234],
        [146, 18, 35],
        [148, 10, 27],
        ...,
        [18, 47, 24],
        [118, 47, 204],
        [118, 47, 04]],

       ...,

       [[ 79, 13, 195],
        [ 79, 132, 95],
        [ 78, 131, 194],
        ...,
        [118, 17, 204],
        [18, 14, 24],
        [118, 147, 20]],

       [[ 5, 128, 191],
        [ 75, 18, 191],
        [ 75, 128, 191],
        ...,
        [18, 17, 204],
        [118, 147, 204],
        [118, 17, 204]],

       [[ 73, 126, 189],
        [ 73, 126, 19],
        [ 74, 127, 190],
        ...,
        [118, 147, 24],
        [18, 147, 204],
        [118, 147, 24]]], dtype=uint8)
3.2图像显示
#图像显示,可创建多窗口,引号内名字任意
cv2.imshow('mingzi',img)
#等待时间,0表示任意键终止,也可以写等待时间
cv2.waitKey(0)
cv2.destroyAllWindows()

def cv_show(name,img):
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
cs=cv_show('linshi',img)
3.3获取图像大小
#获取图像大小,三表示RGB的彩色图
img.shape

(1080, 1440, 3)
3.4灰度图
imgGRAY=cv2.imread('pic.jpg',cv2.IMREAD_GRAYSCALE)
imgGRAY

array([[26, 206, 207, ..., 17, 181, 178],
       [20, 202, 203, ..., 11, 18, 176],
       [19, 197, 199, ..., 184, 13, 82],
       ...,
       [14, 145, 144, ..., 161, 11, 11],
       [14, 11, 11, ..., 11, 11, 11],
       [13, 139, 140, ..., 161, 11, 11]], dtype=uint8)
3.5常见 *** 作(图像保存、类型、像素点个数、数据类型)
#保存图像
cv2.imwrite('GRAY.png',imgGRAY)

#类型
type(imgGRAY)

#像素点个数
imgGRAY.size

#数据类型
imgGRAY.dtype
3.6颜色通道提取

B、G、R三通道shape值一样

b,g,r=cv2.split(pic)
b

array([[15, 155, 16, ..., 11, 147, 18],
       [10, 151, 12, ..., 153, 11, 13],
       [15, 14, 148, ..., 156, 157, 19],
       ...,
       [ 1,  8,  82, ..., 119, 17, 119],
       [ 81,  8,  8, ..., 19, 19, 12],
       [ 81,  81,  82, ..., 120, 11, 123]], dtype=uint8)
3.7组合通道
img1=cv2.merge((b,g,r))
img1.shape
3.8只保留一个通道(另两个通道亮度变成0)
#只保留一个通道
#R通道
new_img1=img1.copy()
#B通道所有变成0
new_img1[:,:,0]=0
#G通道所有变成0
new_img1[:,:,1]=0
#R通道所有变成0
#new_img1[:,:,2]=0
cv_show('linshi',new_img1)
3.9边界填充
#边界填充
img1=cv2.imread('pic.jpg')
top_size,bottom_size,left_size,right_size=(100,100,100,100)
#BORDER_REPLICATE:复制填充,复制最边上的像素
#BORDER_REFLECT:反射填充,对图像像素两遍进行镜像复制如:123456|654321|123456
#BORDER_REFLECT_101:反射填充101,以最边缘的像素为轴,镜像复制如:12345|654321|23456
#BORDER_WRAP:外包装如:123456|123456|123456
#BORDER_CONSTANT:常量法,常数填充,需写value值

replicate=cv2.copyMakeBorder(img1,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REPLICATE)
reflect=cv2.copyMakeBorder(img1,top_size,bottom_size,left_size,right_size,cv2.BORDER_REFLECT)
reflect101=cv2.copyMakeBorder(img1,top_size,bottom_size,left_size,right_size,cv2.BORDER_REFLECT_101)
wrap=cv2.copyMakeBorder(img1,top_size,bottom_size,left_size,right_size,cv2.BORDER_WRAP)
constant=cv2.copyMakeBorder(img1,top_size,bottom_size,left_size,right_size,cv2.BORDER_CONSTANT,value=0)



import matplotlib.pyplot as plt
#plt.subplot(2, 3, 5) 和 plt.subplot(235) 是一样的。需要注意的是所有的数字不能超过10。
#第一个代表行数,第二个代表列数,第三个代表索引位置。
plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL')

plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('replicate')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('reflect')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('reflect101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('wrap')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('constant')

plt.show()
四、视频 *** 作 4.1打开视频
vc=cv2.VideoCapture('test.mp4')

#检查视频是否正确打开
if vc.isOpened():
    #vc.read按顺序每一帧读取,返回两个值:第一个返回值布尔类型(True、False)、
    #第二个返回值是每一帧的图像(数组类型)
    open,frame = vc.read()
    print('1')
else:
    open = False
    print('2')
4.2逐帧转换灰度图
while open:
    ret,frame=vc.read()
    if frame is None:
        break
    if ret ==True:
        #图像色彩转换,把每一帧frame转成灰度图
        gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
        cv2.imshow('linshi',gray)
        #指定每一帧结束等待时间waitKey,或按键空格
        if cv2.waitKey(100000) & 0xFF == 27:
            break
#释放内存
vc.release()
#关闭窗口
cv2.destroyAllWindows()
4.3图像截取(ROI)
#ROI图像截取
newimg = cv2.imread('pic.jpg')
pic=newimg[0:200,0:200]
cv_show('linshi',pic)
#视频图像截取练习
while open:
    ret,frame=vc.read()
    if frame is None:
        break
    if ret ==True:
        #图像色彩转换,把每一帧frame转成灰度图
        gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
        vd=gray[0:400,0:400]
        cv2.imshow('linshi',vd)
        #指定每一帧结束等待时间waitKey,或按键空格
        if cv2.waitKey(100000) & 0xFF == 27:
            break
#释放内存
vc.release()
#关闭窗口
cv2.destroyAllWindows()
五、数值计算 5.1 img1+10
#数值计算
img1=cv2.imread('pic.jpg')
img2=cv2.imread('person.jpg')
#每一个像素点都加10
newimg1=img1+10
5.2 img1+img2
#每个位置像素点的数相加,超过255
#相当于减256或处256的余数
(img1+img2)[:5,:,2]
5.3 cv2.add
#add,如果相加越界就取最大255
cv2.add(img1,img2)[:5,:,2]
六、图像融合 6.1图像大小变换
#图像大小变换
img2=cv2.resize(img2,(1440,1080))
img2.shape



#倍数图像变换
img2=cv2.resize(img2,(0,0),fx=3,fy=3)
plt.imshow(img2)
6.2图像融合叠加
#图像叠加融合,图一权重占比0.4,图二权重占比0.6,提亮度0
res=cv2.addWeighted(img1,0.4,img2,0.6,0)
cv2.imshow('linshi',res)
cv2.waitKey(0)
cv2.destroyAllWindows

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/714293.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-04-24
下一篇2022-04-24

发表评论

登录后才能评论

评论列表(0条)

    保存