若楠带你初识OpenCV(2)--图片修改、运算,边界填充以及阈值调整

news2024/9/20 14:37:09

文章目录

  • OpenCV
  • 图片修改
    • 1. 图片缩放
    • 2. 图片打码
    • 3. 图片组合
  • 图像运算
    • 1. 直接相加
    • 2. add()方法相加
    • 3. 权重相加
  • 边界填充
  • 阈值调整
  • 总结

OpenCV

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它主要用于实时图像处理和计算机视觉任务。

本篇所用图片数据:

链接:学习数据
提取码:dzvx

图片修改

1. 图片缩放

# 图片缩放
a = cv2.imread('GGbond.jpg')

a_new_1 = cv2.resize(a,(400,400)) #直接指定宽,高大小
# 或
a_new_2 = cv2.resize(a,dsize=None,fx=0.5,fy=0.5)# 指定x方向和y方向的缩放倍数

print(a.shape) #高 宽
cv2.imshow('a',a)
cv2.imshow('a_new_1',a_new_1)
cv2.imshow('a_new_2',a_new_2)
cv2.waitKey(10000)
cv2.destroyAllWindows()
------------
(1070, 1080, 3)

在这里插入图片描述

2. 图片打码

将需要打码的位置,用不同的像素点将其覆盖

import numpy as np
a = cv2.imread('GGbond.jpg')
a = cv2.resize(a,(400,400))
cv2.imshow('a',a)
a[150:350,150:350] = np.random.randint(0,256,(200,200,3)) #替换时,要注意两者范围要一样大
cv2.imshow('masaike',a)
cv2.waitKey(10000)
cv2.destroyAllWindows()

在这里插入图片描述

3. 图片组合

也可以理解为,图片替换,即将一张图片中的区域,覆盖在另一张图片上:

# 图片组合
a = cv2.imread("GGbond.jpg")
a = cv2.resize(a,(400,400))
b = cv2.imread("yifei.jpg")
b = cv2.resize(b,(400,400))

a[150:350,150:350] = b[150:350,150:350] #宽 高
cv2.imshow('a',a)
cv2.imshow('b',b)
cv2.waitKey(10000)
cv2.destroyAllWindows()

在这里插入图片描述

图像运算

对像素点的值进行加法运算:直接相加、add()方法相加和权重相加

1. 直接相加

  • 直接相加的过程,即是将图片中每个像素点的值都加上变量值:如c = a_new + 10,就是将a_new这个图片中的每个像素点值加10。但是,注意!!:当两个像素点之和超过255时,相加后的结果减去256,如a+b=260,像素值结果为260-256=4:
a = cv2.imread('GGbond.jpg')
a_new = cv2.resize(a,dsize=None,fx=0.5,fy=0.5)
c = a_new + 10
cv2.imshow('yuan',a_new)
cv2.imshow('tupian',c)
cv2.waitKey(10000)

在这里插入图片描述

  • 将对应区域的每个对应的像素点相加:
a = cv2.imread('GGbond.jpg')
b = cv2.imread('yifei.jpg')
a_new = cv2.resize(a,(400,400))
b_new = cv2.resize(b,(400,400))
c = a_new[50:300,50:300]+b_new[50:300,50:300]
cv2.imshow("a+b",c)
cv2.waitKey(10000)

在这里插入图片描述

2. add()方法相加

注意!!!:add方法的不同,当两个像素点之和超过255时,该位置数值为255,与直接相加不一样:

# add()加法运算
# 注意!!:当两个像素点之和超过255时,该位置数值为255
a = cv2.imread('GGbond.jpg')
b = cv2.imread('yifei.jpg')
a_new = cv2.resize(a,(400,400))
b_new = cv2.resize(b,(400,400))
c = cv2.add(a_new,b_new)
cv2.imshow('a+b',c)
cv2.waitKey(10000)

在这里插入图片描述

3. 权重相加

就是在计算两个图片的像素值之和时,考虑到每幅图的权重:

#图像加权运算
#就是在计算两个图片的像素值之和时,考虑到每幅图的权重
a = cv2.imread('GGbond.jpg')
b = cv2.imread('tt.jpg')
a_new = cv2.resize(a,(400,400))
b_new = cv2.resize(b,(400,400))

c = cv2.addWeighted(a_new,0.2,b_new,0.8,10) #0.2和0.8:分别表示每幅图所占的权重;10:图像的亮度值
cv2.imshow("addWeeighted",c)
cv2.waitKey(10000)
cv2.destroyAllWindows()

在这里插入图片描述

边界填充

将原始图片扩大,使用cv2.copyMakeBorder()函数,用于添加额外边界,参数中使用不同的方法,用不同的形式填充:

copyMakeBorder(src,top,bottom,left,right,borderType)
参数:
-- src:要扩充的原始图像
-- top,bottom,left,right:对应方向上扩充的宽度
-- borderType:定义要添加边框的类型,可以是以下得到一种:
    cv2.BORDER_CONSTANT:需要输入BGR值,用BGR值对应的颜色填充
    cv2.BORDER_REFLECT:以镜面反射的图像填充,类似fedcba/abcdef/fedcba
    cv2.BORDER_REFLECT101:和上面的一样,但是镜像交界处被删除了,类似fedcb/abcdef/edcba
    cv2.BORDER_REPLICATE:用最边界的像素值代替,类似aaaa/abcdef/ffff
    cv2.BORDER_WRAP:左右两边替换,上下替换
a = cv2.imread('yifei.jpg')
yf = cv2.resize(a,(400,400))
top,bottom,left,right = 50,50,50,50

constant = cv2.copyMakeBorder(yf,top,bottom,left,right,borderType=cv2.BORDER_CONSTANT,value=(0,255,0))
reflect = cv2.copyMakeBorder(yf,top,bottom,left,right,borderType=cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(yf,top,bottom,left,right,borderType=cv2.BORDER_REFLECT101)
replicate = cv2.copyMakeBorder(yf,top,bottom,left,right,borderType=cv2.BORDER_REPLICATE)
wrap = cv2.copyMakeBorder(yf,top,bottom,left,right,borderType=cv2.BORDER_WRAP)

cv2.imshow('yuantu',yf)
cv2.waitKey(10000)
cv2.imshow('constant',constant)
cv2.waitKey(10000)
cv2.imshow('reflect',reflect)
cv2.waitKey(10000)
cv2.destroyAllWindows()
cv2.imshow('reflect101',reflect101)
cv2.waitKey(10000)
cv2.imshow('replicate',replicate)
cv2.waitKey(10000)
cv2.imshow('wrap',wrap)
cv2.waitKey(10000)

在这里插入图片描述

在这里插入图片描述

阈值调整

设置像素点阈值,改变图片颜色通道,适用于将图片二值化,cv2.threshold()方法设定阈值处理图像,给图像设定一个范围,高于设定值的像素值为255,低于设定值的,像素值为0:

cv2.threshold()方法返回两个参数:阈值与调整后图片

a = cv2.imread('yifei.jpg',0)
image = cv2.resize(a,(400,400))

#ret就是实际设定的阈值,此处ret为175
ret,binary = cv2.threshold(image,175,255,cv2.THRESH_BINARY)
ret1,binaryinv = cv2.threshold(image,175,255,cv2.THRESH_BINARY_INV)
ret2,trunc = cv2.threshold(image,175,255,cv2.THRESH_TRUNC)
ret3,tozero = cv2.threshold(image,175,255,cv2.THRESH_TOZERO)
ret4,tozeroinv = cv2.threshold(image,175,255,cv2.THRESH_TOZERO_INV)

cv2.imshow('original',image)
cv2.waitKey(0)
cv2.imshow('binary',binary)
cv2.waitKey(0)
cv2.imshow('binaryinv',binaryinv)
cv2.waitKey(0)
cv2.imshow('trunc',trunc)
cv2.waitKey(0)
cv2.imshow('tozero',tozero)
cv2.waitKey(0)
cv2.imshow('tozeroinv',tozeroinv)
cv2.waitKey(0)

在这里插入图片描述

在这里插入图片描述

总结

本篇介绍了:

  1. 图片的修改:缩放、打码、组合。
  2. 图片的运算:其中值得注意的是。
    1. 直接相加:当两个像素点之和超过255时,相加后的结果减去256。
    2. add()方法:当两个像素点之和超过255时,该位置数值为255。
    3. 权重相加:将图片重合,给重合图片设置权重。
  3. 边界填充:将原始图片扩大,使用cv2.copyMakeBorder()函数。
  4. 阈值调整:范围改变图片的像素值,适用于将图片二值化,cv2.threshold()方法设定阈值处理图像,给图像设定一个范围,高于设定值的像素值为255,低于设定值的,像素值为0。

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

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

相关文章

Nginx负载均衡数据流分析

1、各机器ip信息 客户端IP:192.168.3.239 Nginx代理服务器IP:192.168.3.241 服务端IP:192.168.3.238 2、架构图(略) 3、 下图是在服务端上面的抓包分析。 下图是在客户端上面的抓包分析: 下图是在代理服务…

32 配置多路由的静态路由

配置多路由的静态路由 一、多路由器的静态路由配置 ​ 配置网络拓扑配置接口IP地址并通过静态路由的配置实现全网的互通 R0: # 进入特权 Router>enable# 进入全局 Router#configure terminal # 进入接口 Router(config)#interface fastEthernet 0/0# 配置IP R…

如何使用 Mistral 和 Llama2 构建 AI 聊天机器人

开始使用 Mistral 让我们从 Mistral 7B Instruct 的 GGUF 量化版本开始,并使用 AutoClasses ‘AutoModelForCausalLM’ 之一来加载模型。AutoClasses 可以帮助我们自动检索给定模型路径的模型。AudoModelForCausalLM 是具有因果语言建模的模型类之一,这…

SpringBoot如何对接口防刷限流处理

一、API防刷限流: API接口限流,旨在预防用户过度频繁地访问特定接口,以及抵御潜在的恶意攻击行为,这些行为可能导致后端服务器承受过高的负载,进而引发内存资源紧张。为了有效缓解服务器面临的压力,确保服…

数据结构代码集训day15(适合考研、自学、期末和专升本)

本份题目来自B站up:白话拆解数据结构 今日题目如下; (1)编写算法,实现十进制转十六进制; (2)汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老…

javascript网页设计案例,非常详细

这里我将为你提供一个详细的JavaScript网页设计案例。我们将创建一个简单的动态网页&#xff0c;包含一个可以显示当前时间的时钟和一个可以切换背景颜色的按钮。 1. HTML部分 首先&#xff0c;我们需要创建一个HTML文件来定义网页的基本结构。 <!DOCTYPE html> <h…

Python ppt

python生成ppt&#xff0c;数据源为html from lxml import html from pptx import Presentation from pptx.util import Inches from pptx.dml.color import RGBColor from pptx.enum.shapes import MSO_SHAPE# HTML代码 html_content """ <html><b…

【深度学习 transformer】使用pytorch 训练transformer 模型,hugginface 来啦

Hugging Face是一个致力于开源自然语言处理&#xff08;NLP&#xff09;和机器学习项目的社区。它由几个关键组件组成&#xff1a; Transformers&#xff1a;这是一个基于PyTorch的库&#xff0c;提供了各种预训练的NLP模型&#xff0c;如BERT、GPT、RoBERTa、DistilBERT等。它…

【陪诊系统-PC管理端】动态路由

先说说这里为什么要使用动态路由&#xff1f; 因为前面的菜单管理功能模块中&#xff0c;可以创建或修改不同权限&#xff0c;当前登录账号可以绑定不同的权限&#xff0c;不同权限能访问的功能页面不同&#xff0c;所以使用动态路由来控制。 而登录成功后&#xff0c;服务器…

Sentence-BERT实现文本匹配【对比损失函数】

引言 还是基于Sentence-BERT架构&#xff0c;或者说Bi-Encoder架构&#xff0c;但是本文使用的是参考2中提出的对比损失函数。 架构 如上图&#xff0c;计算两个句嵌入 u \pmb u u和 v \pmb v v​之间的距离(1-余弦相似度)&#xff0c;然后使用参考2中提出的对比损失函数作为…

docker 安装 rabbitmq

参考文档&#xff1a; https://hub.docker.com/_/rabbitmq/ https://www.rabbitmq.com/docs/download https://www.kuangstudy.com/zl/rabbitmq#1366643532940484610 执行下面的命令 docker run -d -it --name myrabbit -e RABBITMQ_DEFAULT_USERadmin -e RABBITMQ_DEFAULT_PA…

“解决 Docker 启动失败:排查和修复 overlay2 存储驱动与网络模块问题”。

目录 1.报错如下 2.报错详解 1. ” 表明 overlay2 存储驱动挂载失败&#xff0c;找不到相应设备。 2.表明在路径中找不到 fuse-overlayfs 可执行文件。 3.表明加载 bridge 和 br_netfilter 模块失败。 4.及后续一系列关于停止服务的信息&#xff0c;是由于前面的错误导致的…

硬件生产厂家运维系统思路

当前硬件生产厂家运维已经逐渐摆脱原有的现场调试&#xff0c;初步诊断和运维已经进化为远程运维&#xff1b;主要方式为厂家建立运维系统&#xff0c;使用人员只需要关注厂家公众号或者登录官网&#xff0c;即可完成原来必须到现场才能解决的问题&#xff1b; 原弊端&#xff…

探讨 | 大模型在传统NLP任务的使用姿势

写在前面 今天给大家带来一篇震宇兄&#xff08;知乎邱震宇&#xff09;探讨大模型技术在提升传统NLP类任务效果上的应用方式的文章&#xff0c;主要从文本分类任务出发。 知乎&#xff1a;https://zhuanlan.zhihu.com/p/704983302PS&#xff1a;长文警告&#xff01;建议收藏…

Burp Suite Professional 2024.8 发布下载,新增功能概览

Burp Suite Professional 2024.8 (macOS, Linux, Windows) - Web 应用安全、测试和扫描 Burp Suite Professional, Test, find, and exploit vulnerabilities. 请访问原文链接&#xff1a;https://sysin.org/blog/burp-suite-pro/&#xff0c;查看最新版。原创作品&#xff0…

退火吗?C#/WinForm演示退火算法

退火模型&#xff1a;模拟退火算法&#xff08;Simulated Annealing, SA&#xff09;是一种概率型全局优化算法&#xff0c;灵感来源于物理学中的退火过程。它通过模拟金属退火过程中的加热和缓慢冷却&#xff0c;来寻找问题的近似全局最优解。算法开始时&#xff0c;初始温度设…

70万个哺乳动物功能基因集!这个数据库值得重视

生信碱移 Rummagene数据库 Rummagene 从 PubMed Central (PMC) 出版物提取了超70万个基因集&#xff0c;用于各类基因功能关联注释。 组学技术的引入逐渐将生物和生物医学研究从研究单个基因和蛋白质转向研究基因集、基因簇、分子复合物和基因表达模块。许多生物医学和生物研究…

log4j 清除MDC上下文 MDC分类日志

在项目里需要分类收集处理日志信息&#xff0c;使用 log4j的MDC在线程中添加分类信息。不过最近却出现日志信息记录错误的情况&#xff0c;具体来说&#xff0c;就是会出现本来是属于下一个分类的一部分信息莫名的记录到上一个分类的日志文件中了。这很显然是MDC信息错误造成的…

【nnUNet】环境安装

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ&#xff1a;870202403 公众号&#xff1a;VTK忠粉 前言 本文分享医疗分割模型nnUNet的环境安装教程&#xff0c;希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴的点赞关注&#xff0c;小易会继续努力分享&#xff0…

数据中台 | 数据智能平台产品系列文章,企业开发和盘活数据资产的利器!(上篇)

引言 发展数字经济&#xff0c;实现数字中国是我国的国家战略&#xff0c;坚定且不可动摇&#xff0c;近期随着《数据二十条》、《“数据要素”三年行动计划》、《关于加强数据资产管理的指导意见》等重磅政策的发布&#xff0c;使数字化转型成为越来越多企业增强竞争、扩大营收…