文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

openCV第一篇

2023-09-11 20:45

关注

文章目录

前言:计算机眼中的图片 

1. 图片的读取与显示

1.1 图片的读取 

1.2 显示的图片

1.2.1 显示原始图片 

1.2.2 灰度图

1.3 BGR转换成灰度图、RGB

2. 保存图片

3. 视频的读取与显示

4. 截取图像部分

5. 颜色通道提取

6. 边界填充

7. 数值计算

8. 图像融合

9. 知识点总结*

ac0ddb3b16ac461f8800a63b014ccb32.png

上图我们将一个大的图片分割成许多如20x20的小图片,同理每个小图片它们的RGB矩阵也各自是20x20。

注:opencv默认顺序不是RBG 而是 BGR。

1.1 图片的读取 

import cv2 img = cv2.imread('./data/abv.jpg')

比如我读入这样一张图片,命名为img

9a095a8b15874db5a24eb370f9114921.png

我们可以看到img是一个三维ndarray结构,内部数据类型dtype=unit8:

fa66daf6f2e04378ad0a3e9fad429222.png

1.2 显示的图片

1.2.1 显示原始图片 

cv2.imshow('image',img) # 第一个参数表示窗口指定的名字 第二个为上方imgcv2.waitKey(5000) # 等待时间  如果是5000则在5s后图片窗口自动关闭  0表示任意键关闭cv2.destroyAllWindows() # 时间一到关闭窗口

 ps: 图像的显示也可以是多个窗口

为方便下面使用,我们自己定义一个函数cv_show():

def cv_show(name,img):    cv2.imshow(name,img)    cv2.waitKey(0)    cv2.destroyAllWindows()

执行代码,弹出窗口,显示图片:

cv_show('winName',img)

9a095a8b15874db5a24eb370f9114921.png

1.2.2 灰度图

在之前的基础之上加入参数:cv2.IMREAD_GRAYSCALE 

img2=cv2.imread('./data/abv.jpg',cv2.IMREAD_GRAYSCALE)  # cv2.IMREAD_COLOR

我们执行:

cv_show('win2',img2) 

78e49cf7f9334abbaf807391dcb6dc80.png可以看到该图片最终显示结果为二维(1080,1920) :

ca9cba0adb754f20b82d6d042013260d.png

ps: img.size 输出像素点的个数,可以看到同一张图片BGR彩图是灰度图的三倍。

95b3b5d31c7c4a31b22b22353bfe81dc.png

1.3 BGR转换成灰度图、RGB

当然我们也可以把已经读取进来的BGR彩图转换成灰度图,或者转换为RGB。

img2 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) cv_show('win3',img2)
cv2.imwrite('./data/grayPhoto.jpg',img2)

此时我的data文件夹下就多了一张刚刚处理好名为grayPhoto的灰度图。

899d5d3076bb4e2ebbb5886343545a50.png

视频也是由图像组成的,每一帧都可以当作是一个静止的图像,把图像连在一起看着就像是一个视频了。 我们打游戏时,也是追求一些更高的帧率。

vc = cv2.VideoCapture('./data/stu.mp4')
# 检查是否正确打开if vc.isOpened():    open,frame = vc.read()else:    open = Flase

循环图片播放视频:

while open:    ret,frame = vc.read()    if frame is None:        break    if ret == True:        # 原本frame是(h,w,3)的BGR图片矩阵 经下方加入参数转换成黑白gray        gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)         cv2.imshow('result',gray)        # cv2.waitKey(num) 该图片显示时间/速度 自己可以找一个合适的值        # 27指退出键ESC 退出窗口  当然也可以是 =='q'等        if cv2.waitKey(20)&0xFF == 27:             breakvc.release()cv2.destroyAllWindows()

注:视频放完 ret, frame = vc.read()返回False和None 再次进行循环无法播放视频,需要重新读取。

我们上面介绍,img是一个ndarray矩阵,因此对其进行切片操作:

pho = img[100:800,200:800]  # 进行切片 高100到800 宽200到800cv_show('win2',pho)

fa3f065b36d64fed8f9be0481322affc.png

b,g,r = cv2.split(img)# b.shape g.shape r.shape 都为 (1080, 1920)

执行

cv_show('win3',g) # 或者填 b、r

78e49cf7f9334abbaf807391dcb6dc80.png

结果就是单通道图。

如果我们想显示单一颜色,如红色:

cur_img = img.copy()cur_img[:,:,0] = 0 # B不要了 设置为0cur_img[:,:,1] = 0 # G不要了 设置为0#cur_img[:,:,2] = 0 # R不要了 设置为0cv_show('winR',cur_img)

2b3911f2428745658ca99b850eea7069.png

这个一般用于卷积,在图像周围填充一些像素。

我们以这个图片为例:

img = cv2.imread('./data/gd01.jpg')# img.shape 为 (300, 400, 3)cv_show('win1',img)

f4320c38f6d647c684c59065fdaa50c2.jpeg

在图片的上下左右填充50个像素,介绍5种方法: 

top_size,bottom_size,left_size,right_size=(50,50,50,50)# 不同的填充方法 最后参数改个type值就行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,cv2.BORDER_REFLECT)reflect101=cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_REFLECT_101)wrap = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_WRAP)constant = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_CONSTANT,value=0)
plt.subplot(231),plt.imshow(img,'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('REFLECT_101')plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')# 注matplotlib默认R G B本例只介绍边界填充plt.show()

496a683aaecc451faf5818c736c4d6d8.png

78fc17d7f1a44630a2c7855a1001adac.png

由于是uint8类型最大255 超过相当于结果为 num%256了 

我们使用以下方法保留最大值:

cv2.add(img,img2)

a3903457723941c786a7d8b1ca915878.png

效果如下:

8220c58831cb4036a68f2453b6cf61ef.png

我们导入宽高相同的2张图片:

img = cv2.imread('./data/gd04.jpg')img2 = cv2.imread('./data/gd05.jpg')img3 = cv2.imread('./data/gd06.jpg')print(img.shape,img2.shape,img3.shape) # (281, 600, 3) (281, 600, 3) (337, 600, 3)

如果大小不同 需要手动设置成一样的

img3 = cv2.resize(img3,(600,281))# img3.shape (281, 600, 3)

ps: cv2.resize()另一种操作

img4 = cv2.resize(img3,(0,0),fx=2,fy=1)

我们执行:

res = cv2.addWeighted(img,0.6,img2,0.4,0)plt.imshow(res)

0139f647a62343adbf6c29076b531589.png

R = ax1 + bx2 + c  a、b为权重 c为偏置 这里意为在原亮度上变化多少

import cv2 img = cv2.imread('./data/abv.jpg')img2 = cv2.imread('./data/abv.jpg',cv2.IMREAD_GRAYSCALE) img3 = cv2.imread('./data/abv.jpg',cv2.IMREAD_COLOR) 
def cv_show(name,img):    cv2.imshow(name,img)    cv2.waitKey(0)    cv2.destroyAllWindows()
img2 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) img3 = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) 
cv2.imwrite('./data/grayPhoto.jpg',img2)
vc = cv2.VideoCapture('./data/stu.mp4')# 检查是否正确打开if vc.isOpened():    open,frame = vc.read()else:    open = Flasewhile open:    ret,frame = vc.read()    if frame is None:        break    if ret == True:        # 原本frame是(h,w,3)的BGR图片矩阵 经下方加入参数转换成黑白gray        gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)         cv2.imshow('result',gray)        # cv2.waitKey(num) 该图片显示时间/速度 自己可以找一个合适的值        # 27指退出键ESC 退出窗口  当然也可以是 =='q'等        if cv2.waitKey(20)&0xFF == 27:             breakvc.release()cv2.destroyAllWindows()
pho = img[100:800,200:800]  # 进行切片 高100到800 宽200到800
b,g,r = cv2.split(img)
cur_img = img.copy()cur_img[:,:,0] = 0 # B不要了 设置为0cur_img[:,:,1] = 0 # G不要了 设置为0#cur_img[:,:,2] = 0 # R不要了 设置为0cv_show('winR',cur_img)
top_size,bottom_size,left_size,right_size=(50,50,50,50) # 不同的填充方法 最后参数改个type值就行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,cv2.BORDER_REFLECT)reflect101=cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_REFLECT_101)wrap = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_WRAP)constant = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,cv2.BORDER_CONSTANT,value=0)
cv2.add(img,img2)
img3 = cv2.resize(img3,(600,281))res = cv2.addWeighted(img,0.6,img2,0.4,0)

来源地址:https://blog.csdn.net/suic009/article/details/126067063

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯