2.3 OpenCV随手简记(四)

news2024/11/26 18:39:50

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

自己求图像平均阈值:

# -*- 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.coloradmin.cn/o/1795357.html

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

相关文章

精选网络安全书单:打造数字世界的钢铁长城!

目录 1.前言 2.书单推荐 2.1. 《内网渗透实战攻略》 2.2. 《Kali Linux高级渗透测试&#xff08;原书第4版&#xff09;》 2.3. 《CTF那些事儿》 2.4. 《权限提升技术&#xff1a;攻防实战与技巧》 2.5. 《数字政府网络安全合规性建设指南&#xff1a;密码应用与数据安全…

CentOS6系统因目录有隐含i权限属性致下属文件无法删除的故障一例

CentOS6服务器在升级openssh时因系统目录权限异常&#xff08;有隐含i权限属性&#xff09;&#xff0c;下属文件无法删除&#xff0c;导致系统问题的故障一例。 一、问题现象 CentOS6在升级openssh时&#xff0c;提示如下问题&#xff1a; warning: /etc/ssh/sshd_config c…

五个超实用的 ChatGPT-4o 提示词

GPT-4o 是 OpenAI 最近推出的最新人工智能模型&#xff0c;不仅具备大语言模型的能力&#xff0c;而且拥有多模态模型的看、读、说等能力&#xff0c;而且速度比 GPT-4 更快。下面我们就来介绍几个超实用的 GPT-4o 提示词&#xff0c;帮助大家更好地了解 GPT-4o 的功能和应用场…

Vuforia AR篇(五)— 地平面检测

目录 前言一、什么是地平面识别&#xff1f;二、使用步骤三、示例代码四、效果五、总结 前言 在增强现实&#xff08;AR&#xff09;应用程序的开发中&#xff0c;地平面识别是一项关键技术&#xff0c;它允许虚拟对象与现实世界的地面进行互动。Vuforia 是一个功能强大的 AR …

SpringBoot引入WebSocket依赖报ServerContainer no avaliable

1、WebSocketConfig 文件报错 Configuration EnableWebSocket public class WebSocketConfig {Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}2、报错内容 Exception encountered during context initialization - canc…

UFS协议—新手快速入门(二)【5-6】

目录 五、UFS协议栈 六、UFS技术演进与详解 1、UFS应用层 设备管理器 任务管理器 2、UFS传输层 3、UFS互联层 UFS协议—新手快速入门&#xff08;一&#xff09;【1-4】 五、UFS协议栈 UFS&#xff08;Universal Flash Storage&#xff09;协议是针对固态存储设备&…

德国西门子论未来质量管理 - 如何与明天相遇?

未来制造业的质量 -- 如何用软件方案满足质量要求 作者&#xff1a;Bill Butcher 翻译&编辑&#xff1a;数字化营销工兵 【前言】在Frost&Sullivan最近发表的一份白皮书中&#xff0c;他们讨论了制造业的质量投资。质量是制造过程的关键要素&#xff0c;但似乎比其他…

Ubuntu部署开源网关Apache APISIX

说明 系统&#xff1a;Ubuntu 24.04 LTSDocker版本&#xff1a;v26.1.3Docker Compose版本&#xff1a;v2.26.1 下载和配置 Ubuntu需要安装Docker和Docker Compose 下载apisix-docker仓库 git clone https://github.com/apache/apisix-docker.git修改docker-compose 配置e…

嵌入式学习记录6.6(拷贝构造/友元函数/常成员函数)

一.拷贝构造函数和拷贝赋值函数 1.1拷贝构造函数功能,格式 拷贝构造函数是一种特殊的构造函数&#xff0c;用来将一个类对象给另一个类对象初始化使用的。 1> 用一个类对象给另一个类对象初始化时&#xff0c;会自动调用拷贝构造函数。 2> 当一个类对作为函数的实参&…

【Linux】Linux环境基础开发工具_5

文章目录 四、Linux环境基础开发工具Linux小程序---进度条git 未完待续 四、Linux环境基础开发工具 Linux小程序—进度条 上篇我们实现了一个简易的进度条&#xff0c;不过那仅仅是测试&#xff0c;接下来我们真正的正式实现一个进度条。 接着编写 processbar.c 文件 然…

前端面试项目细节重难点(已工作|做分享)想(八)

面试官&#xff1a;请你讲讲你在该项目中遇到的印象深刻的问题是什么&#xff1f; 答&#xff1a;我的回答&#xff1a;该项目的实现过程中我确实遇到了问题&#xff1a;【我会给大家整理回答思路和角度&#xff0c;那那么遇到这样的问题也可借鉴这种思路进行阐述】 第一层面…

Docker 基础使用(2) 镜像与容器

文章目录 镜像的含义镜像的构成镜像的作用镜像的指令容器的含义容器的状态容器的指令 Docker 基础使用&#xff08;0&#xff09;基础认识 Docker 基础使用 (1) 使用流程概览 Docker 基础使用&#xff08;2&#xff09; 镜像与容器 Docker 基础使用&#xff08;3&#xff09; 存…

达梦8 并行查询

达梦数据库可以通过在查询语句加/* parallel */ HINT并行执行。下面以一个排序语句为例 我们通过一条监控语句查询排序区的使用情况。 最初没有查询结果&#xff08;no rows&#xff09; 伴随着语句insert /* parallel(4) */ into d select * from a order by 2执行&#xff…

Redis系列之淘汰策略介绍

Redis系列之淘汰策略介绍 文章目录 为什么需要Redis淘汰策略&#xff1f;Redis淘汰策略分类Redis数据淘汰流程源码验证淘汰流程Redis中的LRU算法Redis中的LFU算法 为什么需要Redis淘汰策略&#xff1f; 由于Redis内存是有大小的&#xff0c;当内存快满的时候&#xff0c;又没有…

解决CSDN 导入Markdown图片失效不显示问题

每次将MarkDown文件导入CSDN的时候&#xff0c;有些图片总是由于防盗链的问题导致图片加载不出来&#xff0c;还得手动再导一遍&#xff0c;极其不方便。所以我们能不能建立一个属于自己的图片服务器或者说在线图库呢&#xff0c;而且每次使用Typora插入图片的时候都会自动的上…

【ARFoundation自学05】人脸追踪(AR Face manager)实现

1. 修改摄像机朝向渲染方式-选中user 这个方式就会调用前置摄像头 2 创建 AR Session、XR Origin&#xff0c;然后在XR Origin上面添加组件 注意&#xff1a;XR Origin 老版本仍然叫 AR Session Origin 接下来在XR Origin上面添加AR Face Manager组件&#xff0c;如下图&am…

差分原理+练习

差分的原理和前缀和相似&#xff0c;我们先联想一下前缀和。 前缀和计算下标从0到n的和&#xff0c;记为sum[n1];如果想要求出[l,r]区间的和&#xff0c;可以快速的通过sum[r1]-sum[l]来得到 。 前缀和适用于需要多次获取指定连续区间和的情景 而差分即计算相邻两个元素的差…

【Text2SQL 论文】How to prompt LLMs for Text2SQL

论文&#xff1a;How to Prompt LLMs for Text-to-SQL: A Study in Zero-shot, Single-domain, and Cross-domain Settings ⭐⭐⭐⭐ arXiv:2305.11853, NeurlPS 2023 Code: GitHub 一、论文速读 本文主要是在三种常见的 Text2SQL ICL settings 评估不同的 prompt constructio…

Mybatis编写SQL

文章目录 一、用注解编写1.1 增普通增加获取自增ID 1.2 删和改1.3 查单表查询多表查询 二、用xml编写2.1 使用xml的流程2.2 增普通增加获取自增ID 2.3 删 和 改2.4 查 三、#{} 和 ${}3.1 #{} 、${}3.1 预编译 SQL 、即时编译SQL 两种写法是可以同时存在的 一、用注解编写 1.1 …

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-24.5,6 SPI驱动实验-ICM20608 ADC采样值

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…