【OpenCV——python】形态学变换 颜色空间 颜色替换 掩膜 旋转

news2025/1/11 10:14:40

形态学变换

形态学变换一般是处理二值图的腐蚀和膨胀操作,输入二值化图像和核,对图像进行类似卷积的操作

    • 核是一定大小的区域,在原图中进行滑动计算
  • 腐蚀erode

    腐蚀过程

    • 核在图像上滑动,对应位置相乘,最小值作为核中心点的像素值,二值图像为0和1,所有只要核内有0的值,整合核大小位置都会变为0(黑)。全为1才会变白
    • 作用:
      • 腐蚀后的效果是白色部分变细,可以过滤白色的噪点。细化连续的前景区域
    # 腐蚀  黑色变大
    img = cv2.imread('./media/da.png',cv2.IMREAD_GRAYSCALE)
    _,img1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)  
    # 二值化为黑底的图片
    kernel = np.ones((3,3),dtype=np.uint8)  # 核
    img2 = cv2.erode(img1,kernel,iterations=2)  # iterations腐蚀操作的次数
    # cv2.imshow('img',img)
    cv2.imshow('img1',img1)
    cv2.imshow('img2',img2)
    cv2.waitKey(0)
    

在这里插入图片描述

  • 膨胀dilate

    膨胀和腐蚀相反

    • 核在图像上滑动,对应位置相乘,最大值作为核中心点的像素值,二值图像为0和1,所有只要核内有1的值,整个核大小位置都会变为1(白)。全为0才会变黑
    • 作用:
      • 可以扩大目标的物体边界,连接断裂的前景部分,填补空洞
    #  膨胀
    img = cv2.imread('./media/da.png',cv2.IMREAD_GRAYSCALE)
    _,img1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
    kernel = np.ones((3,3),dtype=np.uint8)  # 核
    img2 = cv2.dilate(img1,kernel,iterations=2)
    # cv2.imshow('img',img)
    cv2.imshow('img1',img1)
    cv2.imshow('img2',img2)
    cv2.waitKey(0)
    

在这里插入图片描述

  • 开运算

    • 先腐蚀,后膨胀
    • 作用:
      • 分离物体,消除噪点,去除一些小的干扰块
    # 开操作
    img = cv2.imread('./media/da2.png',cv2.IMREAD_GRAYSCALE)
    _,img1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
    kernel = np.ones((3,3),dtype=np.uint8)  # 核
    img2 = cv2.erode(img1,kernel,iterations=2)
    img3 = cv2.dilate(img2,kernel,iterations=2)
    # cv2.imshow('img',img)
    cv2.imshow('img1',img1)
    cv2.imshow('img2',img2)
    cv2.imshow('img3',img3)
    cv2.waitKey(0)
    

在这里插入图片描述

  • 闭运算

    • 先膨胀,后腐蚀
    • 作用:
      • 消除闭合物体里面的孔洞,填充闭合区域
    img = cv2.imread('./media/da2.png',cv2.IMREAD_GRAYSCALE)
    # _,img1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
    kernel = np.ones((3,3),dtype=np.uint8)  # 核
    
    img2 = cv2.dilate(img,kernel,iterations=2)
    img3 = cv2.erode(img2,kernel,iterations=2)
    
    # cv2.imshow('img',img)
    cv2.imshow('img1',img)
    cv2.imshow('img2',img2)
    cv2.imshow('img3',img3)
    cv2.waitKey(0)
    

在这里插入图片描述

  • 礼貌运算 白帽
    • 原图和开运算之差
    • 放大了裂隙和局部低亮度的区域,可以取出一些微小的物体
  • 黑帽运算
    • 闭运算和原图的差
    • 更暗的区域,一些暗的斑块
    # 黑帽  白帽
    img = cv2.imread('./media/1.jpg',cv2.IMREAD_GRAYSCALE)
    # _,img1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
    kernel = np.ones((3,3),dtype=np.uint8)  # 核
    
    blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)
    gradient = cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)
    
    cv2.imshow('img1',img)
    cv2.imshow('blackhat',blackhat)
    # cv2.imshow('img',img)
    cv2.imshow('gradient',gradient)
    cv2.waitKey(0)
    

在这里插入图片描述
在这里插入图片描述

  • 形态学学梯度
    • 它通过比较原图像与膨胀图和腐蚀图之间的差异来突出图像边缘特征。
#MORPH_GRADIENT
img = cv2.imread('./media/1.jpg',cv2.IMREAD_GRAYSCALE)
# _,img1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
kernel = np.ones((3,3),dtype=np.uint8)  # 核

GRADIENT = cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)
cv2.imshow('GRADIENT',GRADIENT)
cv2.waitKey(0)

在这里插入图片描述

图片颜色识别和替换

三种颜色空间

  • RGB颜色空间
    RGB颜色空间是使用RGB三个通道表示各种颜色。R红G绿B蓝。其颜色模型是笛卡尔坐标系下的颜色空间。
    rgb颜色空间可以表示多种颜色,但是不能很好的体现颜色之间的特性,相似的颜色之间可能有着较远的距离。在这里插入图片描述
  • HSV颜色空间
    HSV颜色空间是另一种表示颜色的方法,H色调 S饱和度 V明度
    同一种类型的颜色,色调在一个取值范围,不同的表现通过S和V表现
    在颜色识别和替换时,通过HSV颜色空间可以便于筛选颜色范围在这里插入图片描述
    在这里插入图片描述

HSV颜色模型
调色

  • 掩膜 mask
    掩膜正如其名,遮挡某个部分,是一个二值化的图像。
    目标区域是1,其他区域是0,通过类似数组的布尔索引进行对目标区域进行操作

把图像转化为HSV颜色空间,通过对颜色范围的选取,识别指定的颜色,生成掩膜
而后进行与运算可以获得指定颜色范围图像

import cv2
import numpy as np

img = cv2.imread('./media/color_mo.png')
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)  # bgr转化为hsv颜色空间

min = np.array([26,43,46],dtype=np.uint8)
max = np.array([34,255,255],dtype=np.uint8)
color_low = np.array([26, 43, 46])
color_high = np.array([34, 255, 255])

mask = cv2.inRange(hsv_img,color_low,color_high)

img_y = cv2.bitwise_and(img,img,mask=mask)  # 与运算  
# 输入两个图片进行与运算 mask则决定与运算的位置 实际参与与运算的位置,保留与运算的像素值
cv2.imshow('img',img)
cv2.imshow('mask',mask)
cv2.imshow('img_y',img_y)
cv2.waitKey(0)

在这里插入图片描述

img[mask!=0] = [0,0,0]
cv2.imshow('img2',img)
cv2.waitKey(0)

在这里插入图片描述

  • 颜色运算
    • 颜色加法
      • 使用cv2.add()
      • opencv 的加法是饱和操作,最大值为255,超过255变成255
      • numpy中的加法,指定了数据类型,超过范围会求模
    • 加权加法
      • cv2.addWeighted() 图像1 权重1 图像2 权重2 偏置
img1 = cv2.imread('./media/nut.png')
img2 = cv2.imread('./media/road.webp')
img2 = img2[:img1.shape[0],:img1.shape[1]]  # 统一尺寸

img_add = cv2.add(img1,img2)
img_add_W = cv2.addWeighted(img1,1,img2,0.5,0)

cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.imshow('img_add',img_add)
cv2.imshow('img_add_W',img_add_W)  #图像1 权重1 图像2 权重2 偏置 

cv2.waitKey(0)
```![图三为img_add图四为img_add_W](https://i-blog.csdnimg.cn/direct/9c8f35e126734a4ebad1ac9b324d9fbd.png)
## ROI切割
计算机眼中的图像实际就是数组,通过对数组的切片,得到自己想要的目标区域,就是ROI切割

```python
import cv2
import numpy as np

img = cv2.imread('./media/1.jpg')

x1 = np.array([230,140])
x2 = np.array([500,600])
print(img,type(img))
img2 = img[230:500,140:600]  # 通过arry数组的索引 对数组切片 实现 图片的切割
# img2 = cv2.rectangle() 在图像上画矩形 

# opencv中的坐标 坐上为0,0 右下增
cv2.imshow('img',img)
cv2.imshow('img2',img2)
cv2.waitKey(0)

在这里插入图片描述

图片旋转

对图片的数组乘以对应的旋转矩阵,就可以实现对图片的旋转
getRotationMatrix2D 生成对应的矩阵
warpAffine 进行空间变换

img = cv2.imread('./media/1.jpg')
shape = img.shape
m = cv2.getRotationMatrix2D((shape[0]//2,shape[1]//2),90,2)  
# 返回仿射变换矩阵  旋转中心坐标  旋转角度(正方向为逆时针) 缩放倍数
img2 = cv2.warpAffine(img,m,(shape[1],shape[0]))  # 旋转变换 图片 矩阵 (shape[1],shape[0]) 旋转后的宽度和高度  窗口的显示
cv2.imshow('img',img)
cv2.imshow('img2',img2)
cv2.waitKey(0)

在这里插入图片描述

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

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

相关文章

孙宇晨领航波场TRON:引领数字资产迈向崭新纪元

​ 在风起云涌的数字资产领域,孙宇晨这个名字始终与创新、突破和引领紧密相连。作为波场TRON的创始人,他不仅是一位远见卓识的领导者,更是推动数字资产迈向新纪元的坚实力量。 自波场TRON诞生以来,孙宇晨便以其敏锐的洞察力…

MongoDB教程

目录 介绍启动命令命令行操作常用命令总结MongoDB Compass 介绍 MongoDB是一个基于分布式文件存储的开源数据库系统,由C语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB将数据存储为一个文档,数据结构由键值对组成&…

轮式遥控无人侦察车技术详解

轮式遥控无人侦察车(Wheeled Remote-Controlled Unmanned Ground Vehicle, RCUGV)作为现代战场及复杂环境侦察作业的重要工具,以其灵活性高、机动性强、风险低等优势,在军事侦察、灾害评估、环境监测等多个领域发挥着不可替代的作…

Cesium 加载高斯泼溅(Gaussian Splatting)模型

Cesium 加载高斯泼溅(Gaussian Splatting)模型 高斯泼溅(Gaussian Splatting) 高斯泼溅是一种革命性的 3D 重建新方法,它试图解决其他方法存在的一些问题,例如处理时间长。对于这种方法,他们的…

成都云飞浩容文化传媒有限公司是做什么的?

在数字经济的浪潮中,电商行业如日中天,成为推动经济发展的重要引擎。在这场没有硝烟的商战中,如何脱颖而出,实现品牌与销量的双重飞跃?成都云飞浩容文化传媒有限公司,作为电商服务领域的佼佼者,…

JavaHadoop白云白云图书管理系统---附源码19272

目 录 摘要 Abstract 1 绪论 1.1 研究背景及意义 1.2国内外研究现状 1.3 论文结构与章节安排 2 白云图书管理系统系统分析 2.1 系统可行性分析 3.2.1 技术可行性 3.2.2 经济可行性 3.2.3 操作可行性 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 …

【Web】LIT CTF 2024 题解(全)

目录 anti-inspect jwt-1 jwt-2 traversed kirbytime scrainbow anti-inspect 因为一直while true,网页会卡死无法访问 const flag "LITCTF{your_%cfOund_teh_fIg_94932}";console.log(flag,"background-color: darkblue; color: white; f…

Nginx异常关闭之中了挖矿病毒kswapd0

问题描述:系统突然无法访问了,登录服务器看了一下是因为Nginx服务关闭,重启后过了几天仍然异常关闭 系统:CentOS 7,Nginx 1.20 尝试解决过程:1、查询nginx/logs/error.log、系统日志,都没有查…

Ubuntu18.04 配置EtherCAT主站IGH SOEM

IGH IGH 是开源的EtherCAT 主站软件 一、安装依赖 sudo apt update sudo apt install build-essential linux-headers-$(uname -r) mercurial autoconf libtool 也不知道安装的完全不完全 uname -r 可以查看内核,我安装的ubuntu18.04的内核版本是 5.4.0-84-gen…

Robotics: Aerial Robotics 部分笔记——Week2(1) 运动学

Week 2.1 g ( q ) g(q) g(q) is called g of q.Rotation matrix R R R: P ′ R P PRP P′RP。旋转矩阵都是正交的(orthogonal),即 R T R R R T I R^TRRR^TI RTRRRTI;行列式为1 d e t R 1 det R 1 detR1;且旋转矩…

【JAVA】阿里巴巴的Arthas:Java应用诊断的利器

文章目录 引言1. Arthas概述2. 安装与配置3. 基本使用4. 业务开发示例5. 高级功能6. 实践经验与案例分析7. 结论8. 附录 更多相关内容可查看 引言 在现代软件开发中,Java作为一种广泛使用的编程语言,承担着大量企业级应用的开发任务。然而,随…

Linux驱动入门实验班——Hello驱动(后附百问网课程视频链接)

目录 1.如何编写驱动程序 2.编写驱动程序 ①确定主设备号 register_chrdev函数 ②file_operations结构体 ③实现对应的函数,填入结构体 copy_from_user函数 copy_to_user函数 ④注册驱动程序 方式一 方式二 ⑤入口函数 ⑥出口函数 ⑦提供设备信息&#x…

Type-C接口取电芯片-LDR6500

取电芯片,特别是针对Type-C接口的取电芯片,如LDR6328系列,是近年来电子设备领域的一个重要技术组件。这些芯片通过智能协议控制,实现高效、安全的充电过程,并广泛应用于智能手机、平板电脑、笔记本电脑、小家电等各类需…

18. 基于ES实战海量数据检索

18. 基于ES实战海量数据检索 一. 概述二. Elasticsearch 全文检索1. 分布式搜索引擎2. 搜索引擎种类3. 倒排索引三. elastic使用1. 官网介绍2. docker安装3. elasticsearch-head工具4. 分词与内置分词4.1 内置分词器(了解即可)4.2 `IK`中文分词器*****************************…

打造高效信息发布平台小程序:设计思路与实践

在当今这个信息爆炸的时代,信息发布平台已成为连接用户与内容的桥梁,小程序以其独特的优势成为众多企业和个人开发者青睐的选择。开发一款专注于信息发布与共享的小程序,旨在为用户打造一个便捷、高效、互动性强的信息获取平台,具…

使用docker-compose快速部署Prometheus+grafana环境

初始化 Prometheusgrafana 创建相关目录并给予权限,持久化目录需要给777权限,否则容器启动失败 cd ~ && mkdir prometheus && chmod 777 prometheus cd prometheus && mkdir grafana_data prometheus_data && chmod 777…

过滤器实验

1.过滤器实验 首先写两个页面之间能够互相跳转 Test1.html通过超链接跳转到test2.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <!--&l…

LDR6020在Type-C手机同时充电与USB2.0数据传输方案

随着科技的飞速发展&#xff0c;Type-C接口已成为智能手机等移动设备的主流充电和数据传输接口。为了满足用户对于高效充电与稳定数据传输的双重需求&#xff0c;乐得瑞科技推出的LDR6020芯片凭借其卓越的性能和丰富的功能&#xff0c;为Type-C手机提供了同时充电与USB2.0数据传…

欢迪迈手机商城设计与开发

TOC springboot137欢迪迈手机商城设计与开发 绪论** 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0…

JavaScript高阶笔记总结(Xmind格式):第一天

Xmind鸟瞰图&#xff1a; 简单文字总结&#xff1a; js高阶知识总结&#xff1a; 理解Object&#xff1a; 1.返回一个由一个给定对象的自身可枚举属性组成的数组&#xff1a;Object.keys(对象名) 2.in 判断属性是否存在&#xff1a;"属性名" in 对象名 …