【Opencv+Yolo】_Day1图像基本处理

news2025/6/2 7:50:13

目录

一、计算机中的视觉:

二、Opencv基本操作:

图片基础处理:

视频基本处理:

图像截取(截取,合并,只保留一个元素)

图像填充

数值计算

图像融合

阈值判断

图像平滑

 图像腐蚀和膨胀+开闭运算

梯度运算:

礼帽和黑帽


一、计算机中的视觉:

  • 图像由像素点组成,像素点由数字矩阵组成(不同亮度:0-255)
  • R、G、B三个通道---彩色图
  • 图像维度:[H,W,3]

二、Opencv基本操作:

  • 图片基础处理:

图片读取cv2.imread('xx.jpg')

图片窗口cv2.imshow()

获取图片属性img.shape()

以灰度形式读取图片img=cv2.imread('.jpg',cv2.IMREAD_GRAYSCALE)

import cv2 #opencv默认读取BGR
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

#图片读取基本步骤
img=cv2.imread('cat.jpg')
img
cv2.imshow('image',img) #窗口名称+图像
cv2.waitKey(0) #0任意键终止,1000就是1000毫秒的意思,一般用0
cv2.destroyAllWindows()

#获取图片属性
img.shape #H,W,C;C=3==RGB

#以灰度图形式读取
img=cv2.imread('cat.jpg',cv2.IMREAD_GRAYSCALE)
img
img.shape
cv_show('image',img)
#保存
cv2.imwrite('mycat.png',img)

或者可以把窗口写成一个函数

def cv_show(name,img):

#define a fuction
def cv_show(name,img):
    cv2.imgshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
  • 视频基本处理:

首先读取视频路径,查看路径是否能够正确读取,显示窗口

#视频读取
#指定路径
vc=cv2.VideoCapture('test.mp4')
#检查是否打开正确
if vc.isOpened():
    open,frame = vc.read()#按顺序一帧一帧读取 open=True/false,第二个参数是当前帧的图像
else:
    open=False

while open:
    ret,frame = vc.read()
    if frame is not None:
        break
    if ret ==True:
        gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)#转换成灰度图
        cv2.imshow('result',gray)
        if cv2.waitKey(100) & 0xFF ==27:
            break
vc.release()
cv2.destroyAllWindows()
  • 图像截取(截取,合并,只保留一个元素)

注意opencv顺序是BGR

#截取部分图像
img=cv2.imread('cat.img')
cat=img[0:200,0:200]#ROI截取
cv_show('cat',cat)
#颜色通道提取BGR
b,g,r=cv2.split(img)
b
b.shape
g
g.shape#bgr大小相同
#合并
img=cv2.merge((b,g,r))
img.shape
#只保留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['G',cur_img]
#只保留B
cur_img=img.copy()
cur_img[:,:,1] = 0
cur_img[:,:,2] = 0
cv_show['B',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)
#反射法,对感兴趣的图像中的像素在两边进行复制abc cba
reflect = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REFLECT)
#反射法,以最边缘像素为轴,对称 gfedcb|abcdefg|hgfedcba
reflect101 = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_REFLECT_101)
#外包装法,cedfgh|abcdefgh|abcdefg
wrap = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv2.BORDER_WRAP)
#常量法,常数数值填充,0是黑框
constant = cv2.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,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('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()

  • 数值计算

cv2.add(img1,img2)超过255,直接等于255

  • 图像融合

必须两个图片size大小相同才可以融合

R = a*x1+b*x2+c 权重和偏置项

#想实现img_cat+img_dog
img_cat.shape
#resize变成猫图片的大小
img_dog=cv2.resize(img_dog,(500,414)
res=cv2.addWeighted(img_cat,0.4,img_dog,0.6,0)
plt.show(res)

cv2.resize()还可以用作图片伸缩

#当不知道图片伸缩多少时,可以把x变成原来的1.5倍
res=cv2.resize(img,(0,0),fx=1.5,fy=1)
  • 阈值判断

THRESH_BINARY:亮的全为白,黑的全为黑

THRESH_BINARY_INV:<127变成255,亮的变成黑的,黑的变成白的

THRESH_TRUNC:>127变成127,剩下的不改变,黑色部分不改变

THRESH_TOZERO:<127的变成0,黑色的部分更暗

  • 图像平滑

均值滤波: 

相当于构造一个filter=简单平均卷积操作

方框滤波:大于255的直接等于255

高斯滤波:构建高斯分布

中值滤波:使用中间值替代

#图像平滑
img2=cv2.imread('lenaNoise.png')
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
#均值滤波加起来除个数求均值,一般选(3,5,7)
blur=cv2.blur(img,(3,3))
cv2.imshow('blur',blur)
cv2.waitKey(0)
cv2.destroyAllWindows()
#方框滤波,基本和均值一样,可以选择归一化,大于255直接就是255
blur=cv2.boxFilter(img,-1,(3,3),normalize=True)
#高斯滤波,卷积核满足高斯分布
aussian = cv2.GaussianBlur(img,(5,5),1)
cv2.imshow('aussian',aussian)
cv2.waitKey(0)
cv2.destroyAllWindows()
#中值滤波,从小到大排序找中间值,中间值代替,不考虑噪声,推荐
median = cv2.medianBlur(img,5)
cv2.imshow('medien',medien)
cv2.waitKey(0)
cv2.destroyAllWindows()

三、图像形态学操作

  •  图像腐蚀和膨胀+开闭运算

当图片有一些杂纹,需要通过腐蚀来去掉

当腐蚀之后,可能对原图片有伤害,就要用膨胀恢复

#腐蚀操作,外面的颜色腐蚀里面,去掉杂纹
img=cv2.imread('dige.png')
cv2.imshow('img',img)
cv2.destoryAllWindows()
kernel = np.ones((3,3),np.unit8)
dige_erosion = cv2.erode(img,kernel,iterations = 1)
cv2.imshow('erosion',erosion)
cv2.waitKey(0)
cv2.destroyAllWindows()
#膨胀操作,里面的颜色扩张
kernel = np.ones((3,3),np.unit8)
dige_dilate = cv2.dilate(dige_erosion,kernel,iterations = 1)
cv2.imshow('dilate',dige_dilate)
cv2.waitKey(0)
cv2.destroyAllWindows()

开运算:先腐蚀,再膨胀
闭运算:先膨胀,再腐蚀

#开运算:先腐蚀,再膨胀
img= cv2.imread('dige.png')
kernel = np.ones((5,5),np.unit8)
opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
#闭运算:先膨胀,再腐蚀
closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)
  • 梯度运算:

得到轮廓边界信息

#梯度运算:
#梯度=膨胀-腐蚀
pie= cv2.imread('pie.png')
kernel = np.ones((7,7),np.unit8)
dilate = cv2.dilate(pie,kernel,iterations = 5)
erosion = cv2.erode(pie,kernel,iterations = 5)
res = np.hstack((dilate,erosion))
gradient = cv2.morphologyEx(pie,cv2.MORPH_GRADIENT,kernel)
  • 礼帽和黑帽

礼帽=原始输入-开运算(原始的杂纹=原始-无杂纹)TOPHAT

黑帽=闭运算-原始输入(原始的小轮廓)BLACKHAT

#礼帽=原始输入-开运算(原始的杂纹=原始-无杂纹)
img= cv2.imread('dige.png')
tophat=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
#黑帽=闭运算-原始输入(原始的小轮廓)
blackhat=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2386847.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从比分滚动到数据革命:体育数据如何重构我们的观赛体验?

当凌晨三点的欧冠决赛与闹钟冲突时&#xff0c;当世界杯小组赛因时差难以全程跟进时&#xff0c;当代体育迷早已不再依赖电视直播 —— 打开手机里的比分网&#xff0c;实时跳动的体育大数据正构建着全新的观赛宇宙。这些曾经被视为 "辅助工具" 的平台&#xff0c;如…

华为网路设备学习-23(路由器OSPF-LSA及特殊详解 二)

OSPF动态路由协议要求&#xff1a; 1.必须有一个骨干区域&#xff08;Area 0&#xff09;。有且仅有一个&#xff0c;而且连续不可分割。 2.所有非骨干区域&#xff08;Area 1-n&#xff09;必须和骨干区域&#xff08;Area 0&#xff09;直接相连&#xff0c;且所有区域之间…

VPet虚拟桌宠,一款桌宠软件,支持各种互动投喂等. 开源免费并且支持创意工坊

&#x1f4cc; 大家好&#xff0c;我是智界工具库&#xff0c;每天分享好用实用且智能的开源项目&#xff0c;以及在JAVA语言开发中遇到的问题&#xff0c;如果本篇文章对您有所帮助&#xff0c;请帮我点个小赞小收藏小关注吧&#xff0c;谢谢喲&#xff01;&#x1f618; 工具…

新书速览|ASP.NET MVC高效构建Web应用

《ASP.NET MVC高效构建Web应用》 本书内容 《ASP.NET MVC高效构建Web应用》以目前流行的ASP.NET MVC 5、HTML和Razor为主线&#xff0c;全面系统地介绍ASP.NET MVC Web应用开发的方法&#xff0c;配套提供实例源码、PPT课件与作者一对一QQ答疑服务。 《ASP.NET MVC高效构建Web…

MySQL 9.3 超详细下载安装教程(Windows版)附图文说明

MySQL 9.3 超详细下载安装教程&#xff08;Windows版&#xff09;附图文说明 &#x1f4a1; 本文适用于Windows 10/11系统&#xff0c;包含完整的安装流程、环境配置和疑难解答。建议收藏备用&#xff01; 一、下载MySQL 1. 访问官网 进入MySQL官方下载页面&#xff1a;http…

Linux之软件包管理器(CentOS系统) —— yum

目录 一、软件包管理器 1-1什么是软件包 1-2 Linux软件生态 Linux下载软件的过程(Ubuntu、Centos、other) 操作系统的好坏评估---生态问题 1. 应用软件生态 2. 硬件兼容性 3. 开发者社区与开源生态 4. 商业合作与盈利模式 5. 用户粘性与使用习惯 6. 安全与合规生态 …

webpack吐环境分析

需要解决的问题 扣取下来的webpack文件过大 解决思路 用ast将需要的代码扣下来 结果展示 实现步骤 第一步&#xff1a;我们得知道需要哪些模块 在入口处&#xff0c;增加模块记录 第二步&#xff0c;分析ast代码 通过分析发现,key 有三种值 分别为NumbericLiteral、StringLi…

Unity InputField 滑动滚轮 实现对文本的滚动

一。效果演示&#xff1a; 二。实现原理&#xff1a; 创建一个脚本KeInputScroll.cs 继承InputField类和IScrollHandler接口。如下面代码所示&#xff1a; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;public class KeInputScroll : InputFiel…

机械设计插件

在进行机械设计的时候&#xff0c;很多厂家对我们开放了外购件的模型&#xff0c;方便我们进行设计选购&#xff0c;但是尽管如此&#xff0c;我们在使用的时候还是很麻烦&#xff0c;我目前使用的是Part data manager来管理这些厂家的模型&#xff0c;使用方法非常简单。 首先…

RabbitMQ核心机制——延迟队列

一、 什么是延迟队列&#xff1f; 消息发送之后&#xff0c;不想让消费者马上收到消息&#xff0c;而是等待特定时间后消费者才能拿到这条消息进行消费。 二、 如何实现延迟队列 RabbitMQ并没有直接支持延迟队列这一功能&#xff0c;如果需要实现延迟队列&#xff0c;有两种方法…

华为云Flexus+DeepSeek征文|Flexus云服务器Dify-LLM资源部署极致体验Agent

前引&#xff1a;重磅来袭&#xff01;本次以DeepSeek-V3/R1商用大模型和Dify-LLM应用平台一键部署为核心&#xff0c;专为新手打造“开箱即用”的AI开发体验。无论你是想快速搭建企业级AI应用&#xff0c;还是探索大模型落地的无限可能&#xff0c;只需跟随小编实现三步走&…

【Elasticsearch入门到落地】13、DSL查询详解:分类、语法与实战场景

接上篇《12、索引库删除判断以及文档增删改查》 上一篇我们讲解了如何判断索引库是否存在并删除它&#xff0c;以及如何对索引库中的文档进行增删改查操作。本篇我们进入ElasticSearch的DSL语法的详解。 Elasticsearch&#xff08;ES&#xff09;作为强大的分布式搜索引擎&…

[欠拟合过拟合]机器学习-part10

7.欠拟合过拟合 7.1欠拟合 欠拟合是指模型在训练数据上表现不佳&#xff0c;同时在新的未见过的数据上也表现不佳。这通常发生在模型过于简单&#xff0c;或者是训练的次数不够&#xff0c;无法捕捉数据中的复杂模式时。欠拟合模型的表现特征如下&#xff1a; 训练误差较高。 …

【windwos】文本编辑器Notepad++ 替代品Notepad--

一、N和N--对比介绍 曾经备受推崇的「Notepad」曾是Windows上的经典代码编辑器。然而&#xff0c;作者的一些政治言论已经让它被广大中国用户抛弃。 一个名为「Notepad--」的新编辑器&#xff0c;也是开源免费&#xff0c;功能和实用性也在尽可能接近。与此同时&#xff0c;「N…

Linux基本指令篇 —— clear指令

clear 是 Linux 和 Unix 系统中用于清空终端屏幕的常用命令。它的作用是移除当前终端窗口中的所有可见内容&#xff0c;提供一个干净的界面&#xff0c;类似于“刷新”终端。以下是关于 clear 的详细解析&#xff1a; 目录 1. 基本用法 2. 实现原理 3. 常见场景 场景 1&…

阿里云DDoS防护:万一被“黑”了,如何更换IP地址?

阿里云DDoS防护&#xff1a;万一被“黑”了&#xff0c;如何更换IP地址“绝地反击”&#xff1f; 各位站长、运维老铁、业务负责人们&#xff0c;大家好&#xff01;在如今这个网络世界&#xff0c;最让人提心吊胆的&#xff0c;莫过于遭遇**DDoS攻击&#xff08;分布式拒绝服…

【小白量化智能体】应用2:编写通达信绘图指标及生成Python绘图程序

【小白量化智能体】应用2&#xff1a;编写通达信绘图指标及生成Python绘图程序 【小白量化智能体】是指能够自主或半自主地通过与环境的交互来实现目标或任务的计算实体。智能体技术是一个百科全书&#xff0c;又融合了人工智能、计算机科学、心理学和经济学等多个领域的知识&a…

C++23 std::start_lifetime_as:用于隐式生存期类型的显式生存期管理函数 (P2590R2)

文章目录 一、C23简介二、std::start_lifetime_as 基本概念函数原型模板参数参数返回值注意事项示例代码 三、std::start_lifetime_as 的作用1. 避免复杂的拷贝操作2. 保持对象表示不变3. 简化代码逻辑 四、std::start_lifetime_as 的使用场景1. 内存池管理2. 类型双关&#xf…

Innodb底层原理与Mysql日志机制深入刨析

MySQL的内部组件结构 大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。 Server层 主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实…

JMeter-SSE响应数据自动化

结构图 背景&#xff1a; 需要写一个JMeter脚本来进行自动化测试&#xff0c;主要是通过接口调用一些东西&#xff0c;同时要对响应的数据进行处理&#xff0c;包括不限于错误信息的输出。 1.SSE(摘录) SSE&#xff08;Server-Sent Events&#xff09;是一种基于HTTP协议、允许…