2.3 OpenCV随手简记(四)

阈值处理是很多高级算法底层处理的预方法之一。

自己求图像平均阈值:

# -*- coding=GBK -*-
import cv2 as cv
import numpy as np
#求出图像均值作为阈值来二值化
def custom_image(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
cv.imshow("原来", gray)
h, w = gray.shape[:2]
m = np.reshape(gray, [1, w*h])#化为一维数组
mean = m.sum() / (w*h)
print("mean: ", mean)
ret, binary = cv.threshold(gray, mean, 255, cv.THRESH_BINARY)
cv.imshow("二值", binary)
src = cv.imread("C://1.jpg")
custom_image(src)
cv.waitKey(0)
cv.destroyAllWindows()

基于cv.inRange() 的彩色图像分割与视频图像追踪

灰度图像大多通过算子寻找边缘和区域生长融合来分割图像。彩色图像增加了色彩信息,可以通过不同的色彩值来分割图像,常用彩色空间HSV/HSI, RGB, LAB都可以用于分割!

inRange()函数介绍

主要介绍inrange() 来划分颜色区域。

1RGB颜色空间每个通道分量受亮度影响大,HSV颜色空间受亮度影响较小,所以在HSV颜色空间下进行颜色追踪;

2EmguCVOpenCVHSV取值: H0-180 ; S: 0-255; V: 0-255(注意取值范围;

 3、常用的HSV参考值:

 4、使用inRange()函数在HSV空间中寻找HSV在某一范围内的值,输出掩膜,作为寻找结果。

# 源图像中仅有图像值介于 lowerb 和 upperb 之间的值才不为 0 ,且值将变成 255
dst = cv2.inRange(src, lowerb, upperb)
# src为输入图像
# lowerb为lower阈值, 低于 lowerb 的值,其所对应的图像值将为 0,变黑;
# upperb为upper阈值, 高于 upperb 的值,图像值变为 0
# **dst** 返回处理后的图像

 代码示例:

  1. 颜色显示
import cv2
import numpy as np
img_cv2 = cv2.imread(img_file)
hsv = cv2.cvtColor(img_cv2, cv2.COLOR_BGR2HSV)
lower_red = np.array([20, 20, 20])
upper_red = np.array([200, 200, 200])
# mask -> 1 channel
mask = cv2.inRange(hsv, lower_red, upper_red)
# cv2.imshow('Display', mask)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
plt.subplot(1,2,1); plt.imshow(img_cv2);plt.axis('off');plt.title('BGR')
plt.subplot(1,2,2); plt.imshow(mask);plt.axis('off');plt.title('mask')
plt.show()

         2.视频特定颜色追踪

#视频特定颜色追踪
import cv2 as cv
import numpy as np
def extrace_object_demo():
capture=cv.VideoCapture("C:/Users/df/Desktop/3333.mp4")
while True:
ret, frame = capture.read()
if ret == False:
break
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV) #色彩空间由RGB转换为HSV
lower_hsv = np.array([100, 43, 46]) #设置要过滤颜色的最小值
upper_hsv = np.array([124, 255, 255]) #设置要过滤颜色的最大值
mask = cv.inRange(hsv, lower_hsv, upper_hsv) #调节图像颜色信息(H)、饱和
度(S)、亮度(V)区间,选择蓝色区域
cv.imshow("video",frame)
cv.imshow("mask", mask)
c = cv.waitKey(40)
if c == 27: #按键Esc的ASCII码为27
break
extrace_object_demo()
cv.destroyAllWindows()

        3.追踪视频中的颜色对图片通道的分离与合并

from cv2 import cv2 as cv
import numpy as np
def video_demo():
# VideoCapture.open
capture = cv.VideoCapture('C:\\pictures\\videos\\1.mp4')
while True:
ret,frame = capture.read()
if ret == False:
break
hsv = cv.cvtColor(frame,cv.COLOR_BGR2HSV)
# 根据那个表可以修改所想的颜色,可以追踪中视频中的颜色
lower_hsv = np.array([156,43,46])
upper_hsv = np.array([180,255,255])
mask = cv.inRange(hsv,lowerb=lower_hsv, upperb=upper_hsv)
# 小技巧,所显示的是所需要的颜色部分
dst = cv.bitwise_and(frame,frame,mask=mask)
cv.imshow('dst',dst)
cv.imshow('video',frame)
cv.imshow('mask',mask)
c = cv.waitKey(40)
if c == 27 :
break
'''
filepath = "C:\\pictures\\0.jpg"
img = cv.imread(filepath) # blue green red
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",img)
# 通道的分离与合并
b,g,r = cv.split(img)
cv.imshow('blue',b)
cv.imshow('green',g)
cv.imshow('red',r)
img[:,:,2] = 0 #把红色去掉了
img = cv.merge([b,g,r]) #通道合起来
cv.imshow('changed image',img)
'''
video_demo()
cv.waitKey(0)
cv.destroyAllWindows()


 图像缩放:

图像缩放只是调整图像的大小,为此, OpenCV 为我们提供了一个函数 cv.resize() ,原函数如下:

resize(src, dsize, fx=None, fy=None, interpolation=None)
src 表示的是输入图像,而 dsize 代表的是输出图像的大小,如果为 0 ,则:
dsize = Size(round(fx src.cols), round(fy src.rows))dsize = Size(round(fx src.cols), round(fy src.rows))
dsize fx fy 不能同时为 0
fx fy 是沿 x 轴和 y 轴的缩放系数,默认取 0 时,算法如下:
fx=(double)dsize.width/src.colsfx=(double)dsize.width/src.cols
fy=(double)dsize.height/src.rowsfy=(double)dsize.height/src.rows
最后一个参数 interpolation 表示插值方式:
  • INTER_NEAREST - 最近邻插值
  • INTER_LINEAR - 线性插值(默认)
  • INTER_AREA - 区域插值
  • INTER_CUBIC - 三次样条插值
  • INTER_LANCZOS4 - Lanczos插值
看一个简单的示例:
import cv2 as cv
#读取图片
src = cv.imread('maliao.jpg')
print(src.shape)
#图像缩放
result = cv.resize(src, (300, 150))
print(result.shape)
#显示图像
cv.imshow("src", src)
cv.imshow("result", result)
#等待显示
cv.waitKey()
cv.destroyAllWindows()

结果如下:

需要注意的是,这里 设置的是 dsize 的列数为 300 ,行数为 150 

同理,我们可以通过设定一个比例进行缩放,可以是等比例缩放,也可以是不等比例缩放,下面是等比例缩放的示例:

import cv2 as cv
# 设定比例
scale = 0.5
#读取图片
src = cv.imread('maliao.jpg')
rows, cols = src.shape[:2]
#图像缩放
result = cv.resize(src, ((int(cols * scale), int(rows * scale))))
print(result.shape)
#显示图像
cv.imshow("src", src)
cv.imshow("result", result)
#等待显示
cv.waitKey()
cv.destroyAllWindows()

除了可通过设定 dszie 对图像进行缩放,我们还可以通过设定 fx fy 对图像进行缩放:

import cv2 as cv
#读取图片
src = cv.imread('maliao.jpg')
print(src.shape)
#图像缩放
result = cv.resize(src, None, fx=1.5, fy=0.2)
print(result.shape)
#显示图像
cv.imshow("src", src)
cv.imshow("result", result)
#等待显示
cv.waitKey()
cv.destroyAllWindows()

两种操作方法:

import cv2 as cv
#读取图片
src = cv.imread('maliao.jpg')
print(src.shape)
#图像缩放
result1 = cv.resize(src, None, fx=0.5, fy=0.7)
result2 = cv.resize(src, (src.shape[0]+200,src.shape[1]+300))
print(result1.shape)
print(result1.shape)
#显示图像
cv.imshow("src", src)
cv.imshow("result1", result1)
cv.imshow("result2", result2)
#等待显示
cv.waitKey()
cv.destroyAllWindows()
import cv2 as cv
#读取图片
src1 = cv.imread('1111.jpg')
src2 = cv.imread('2222.jpg')
#将图像1缩放为图像2的大小
src1 = cv.resize(src1,(src2.shape[1],src2.shape[0]))
#显示图像
cv.imshow("result1", src1)
cv.imshow("result2", src2)
#等待显示
cv.waitKey()
cv.destroyAllWindows()
缩放的动态显示
import cv2 as cv
import time
#读取图片
src = cv.imread('beauty5.jpeg')
# 原图的高、宽
rows, cols = src.shape[:2]
i = 1
while cv.waitKey(1) == -1: #等待1毫秒后,用户按下任意键
if i<=12:
i = i+1
elif i>12:
i = 1
#图像缩放
dst = cv.resize(src, None, fx=0.1*i, fy=0.1*i)
# 生成 M 矩阵
#M = cv.getRotationMatrix2D((cols/2, rows/2), 0+i, 1)
# 绕图像的中心旋转
# 参数:旋转中心 旋转度数 scale
#dst = cv.warpAffine(src, M, (cols, rows))
# 显示图像
cv.imshow("dst", dst)
time.sleep(1/10)
cv.destroyWindow("dst")

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

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

相关文章

【JavaScript】---DOM操作1:获取元素

【JavaScript】—DOM操作1&#xff1a;获取元素 文章目录 【JavaScript】---DOM操作1&#xff1a;获取元素一、什么是DOM&#xff1f;1.1 概念1.2 图例演示 二、查找HTML元素2.1 getElementById()2.2 getElementsByTagName()2.3 getElementsByClassName()2.4 querySelector()2.…

Go语言 几种常见的IO模型用法 和 netpoll与原生GoNet对比

【go基础】16.I/O模型与网络轮询器netpoller_go中的多路io复用模型-CSDN博客 字节开源的netPoll多路复用器源码解析-CSDN博客 一、几种常见的IO模型 1. 阻塞I/O (1) 解释&#xff1a; 用户调用如accept、read等系统调用&#xff0c;向内核发起I/O请求后&#xff0c;应用程序…

【Spring Cloud Alibaba】服务注册与发现+远程调用

目录 注册微服务到Nacos&#xff08;服务提供者&#xff09;创建项目修改依赖信息添加启动注解添加配置信息启动服务&#xff0c;Nacos控制台查看服务列表 注册微服务到Nacos&#xff08;服务消费者&#xff09;创建项目添加依赖信息添加启动注解添加配置信息启动服务&#xff…

基于卷积神经网络(CNN)的深度迁移学习在声发射(AE)监测螺栓连接状况的应用

螺栓结构在工业中用于组装部件&#xff0c;它们在多种机械系统中扮演着关键角色。确保这些连接结构的健康状态对于航空航天、汽车和建筑等各个行业至关重要&#xff0c;因为螺栓连接的故障可能导致重大的安全风险、经济损失、性能下降和监管合规问题。 在早期阶段检测到螺栓松动…

vue3路由详解,从0开始手动配置路由(vite,vue-router)

创建一个不含路由的vue项目 &#xff08;查看路由配置可以直接跳过这一段&#xff09; 输入npm指令&#xff0c;然后写一个项目名称&#xff0c;之后一路回车即可 npm create vuelatest 注意这里我们不选引入vue router&#xff0c;成功后可以 查看目录 然后按提示信息输入指…

新闻出版署发布新规定,腾讯游戏限制未成年人端午期间每天一小时

原标题&#xff1a;腾讯游戏端午节期间针对未成年人的游戏时间限制措施 易采游戏网6月3日消息&#xff1a;近日国家新闻出版署针对未成年人沉迷网络游戏问题发布了《关于进一步严格管理 切实防止未成年人沉迷网络游戏的通知》&#xff0c;旨在加强对未成年人保护的力度&#xf…

GIS之arcgis系列06:线划图缓冲区分析

缓冲区工具将在输入要素周围指定距离内创建缓冲区面。 缓冲区例程将遍历输入要素的每个折点并创建缓冲区偏移。 通过这些偏移创建输出缓冲区要素 原理&#xff1a; 01.打开文件 02.确定单位&#xff0c;在文件属性里。 03.工具箱-->分析工具-->邻域分析-->缓冲区。 …

派派派森02

目录 1.容器 1.列表 2.元组 3.字符串 3.序列 4.集合 5.字典 2.数据容器通用操作 • max最大元素 • min最小元素 • 容器的通用转换功能 • 通用排序功能 3.字符串大小比较 4.函数中多个返回值 5.函数参数多种传递方式 1.位置参数 2.关键字参数 3.缺省参数 …

【C++/STL】list(常见接口、模拟实现、反向迭代器)

&#x1f308;个人主页&#xff1a;秦jh_-CSDN博客&#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/qinjh_/category_12575764.html?spm1001.2014.3001.5482 目录 前言 list的常见接口 对迭代器的封装 节点 重载-> const迭代器 list与vector的对比 反向迭代…

2020长安杯

链接成功 检材一 1检材 1 的操作系统版本是 ()A. CentOS release 6.5 (Final)B. Ubuntu 16.04.3 LTSC. Debian GNU/ Linux 7.8 (wheezy)D. CentOS Linux release 7.6.1810 (Core)D 2检材 1 中&#xff0c;操作系统的内核版本是 ()(答案格式&#xff1a; “1.2.34” 数字和半角…

JVMの堆、栈内存存储

1、JVM栈的数据存储 通过前面的学习&#xff0c;我们知道&#xff0c;将源代码编译成字节码文件后&#xff0c;JVM会对其中的字节码指令解释执行&#xff0c;在解释执行的过程中&#xff0c;又利用到了栈区的操作数栈和局部变量表两部分。 而局部变量表又分为一个个的槽位&…

前端将DOM元素导出为图片

前端工作中经常会用到把一些元素导出&#xff0c;比如表格&#xff0c;正好项目有遇到导出为excel和导出为图片&#xff0c;就都封装实现了一下&#xff0c;以供其他需求的开发者使用&#xff1a; 1.导出为文档 这个说白了就是下载的功能&#xff0c;传过去检索参数&#xff…

超分辨重建——SRGAN网络训练自己数据集与推理测试(详细图文教程)

&#x1f4aa; 专业从事且热爱图像处理&#xff0c;图像处理专栏更新如下&#x1f447;&#xff1a; &#x1f4dd;《图像去噪》 &#x1f4dd;《超分辨率重建》 &#x1f4dd;《语义分割》 &#x1f4dd;《风格迁移》 &#x1f4dd;《目标检测》 &#x1f4dd;《暗光增强》 &a…

计算机视觉与模式识别实验2-1 角点检测算法(Harris,SUSAN,Moravec)

文章目录 &#x1f9e1;&#x1f9e1;实验流程&#x1f9e1;&#x1f9e1;Harris算法SUSAN算法Moravec算法 &#x1f9e1;&#x1f9e1;全部代码&#x1f9e1;&#x1f9e1; &#x1f9e1;&#x1f9e1;实验流程&#x1f9e1;&#x1f9e1; Harris算法 Harris算法实现步骤&…

如何快速定位到影响mysql cpu飙升的原因——筑梦之路

通常我们只需要执行show processlist 进行查看&#xff0c;一般执行时间最长的SQL八九不离十就是罪魁祸首&#xff0c;但当show processlist的输出有近千条&#xff0c;那么很难第一眼就发现有问题的SQL&#xff0c;那么如何快速找到呢&#xff1f;其实也非常简单。我们知道mys…

JS面试题:什么是原型和原型链

一、原型 函数都有prototype属性,称之为原型&#xff0c;也称为原型对象原型 1.可以放一些属性和方法&#xff0c;共享给实例对象使用 2.原型可以做继承 二、原型链: 对象都有proto 属性,这个属性指向它的原型对象,原型对象也是对也有 proto 属性,指向原型对象的原型对象,这样一…

论文摘要一般要写些什么内容?

论文摘要通常需要包含以下几个关键内容&#xff1a; 研究背景与目的&#xff1a;简要介绍研究的背景信息&#xff0c;包括研究领域的重要性、当前的研究现状以及存在的问题。然后&#xff0c;清晰地阐述研究的目的、研究问题或研究假设&#xff0c;让读者明白研究的出发点和意图…

推荐一个图片识别的llama3微调版本 清华面壁项目

水一篇&#xff1a; MiniCPM-V是面向图文理解的端侧多模态大模型系列。该系列模型接受图像和文本输入&#xff0c;并提供高质量的文本输出。自2024年2月以来&#xff0c;我们共发布了4个版本模型&#xff0c;旨在实现领先的性能和高效的部署&#xff0c;目前该系列最值得关注的…

工业4.0利器:MES系统

工业4.0利器&#xff1a;MES系统 &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &#x1f31d;分享学习心得&#xff0c;…

Java如何实现pdf转base64以及怎么反转?

问题需求 今天在做发送邮件功能的时候&#xff0c;发现邮件的附件部分&#xff0c;比如pdf文档&#xff0c;要求先把pdf转为base64&#xff0c;邮件才会发送。那接下来就先看看Java 如何把 pdf文档转为base64。 两种方式&#xff0c;一种是通过插件 jar 包的方式引入&#xf…