计算机视觉(opencv-python)入门之常见图像处理基本操作(待补充)

        图像预处理是计算机视觉任务中的关键步骤,它通过对原始图像进行处理,以提高后续图像分析、特征提取和识别的准确性。

示例图片 

目录

常见图像预处理方法

灰度化处理

法一

 法二

 说明

切片截取部分图像数据 

cv2.cvtColor() 颜色空间转换

cv2.split():颜色通道提取

 cv2.resize():修改图像尺寸

 cv2.addWeighted()图像融合

cv2.merge()图像合并

cv2.copyMakeBorder()边界填充


常见图像预处理方法


灰度化处理

法一

#灰度化处理
#法1,直接读取灰度图
import cv2
gray_image=cv2.imread('test.jpg',cv2.IMREAD_GRAYSCALE)
cv2.imshow('gray_image',gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果

 法二

#灰度化处理
#法2,读取时不指定 flags(默认 cv2.IMREAD_COLOR),然后使用 cv2.cvtColor 转换为灰度图
import cv2
image=cv2.imread('test.jpg',cv2.IMREAD_UNCHANGED)
grayt_image=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imshow('gray_image',gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows() 

结果 

 说明

        两种方法都可对彩色图像进行灰度化处理,法一是在读取图像的同时将其转换为灰度图像。法二则是先读取彩色图像,再进行颜色空间转换。法一相对于法二更加节省内存,因为法一在图像处理的读取时就进行了灰度化处理,避免了彩色图像占用的大量内存空间。

        这两种处理方法的结果是一致的:
 


切片截取部分图像数据 

        读取后的图像是(高,宽,通道数)的ndarray结构,若我们对图像的某一部分感兴趣,那我们只需要在高和宽对应的数组上进行切片即可获取到图像的部分数据。   

#截取部分图像数据
import cv2
image=cv2.imread('test.jpg',cv2.IMREAD_UNCHANGED)
cv2.imshow('image',image[100:500,0:300])
cv2.waitKey(0)
cv2.destroyAllWindows()  

        原图像的尺寸为500x500,这里我们对其进行切片截取。截取区域为高[100:500]x宽[0:300]。


cv2.cvtColor() 颜色空间转换

      cv2.cvtColor()是OpenCV库中一个非常实用的函数,它能够将图像从一个颜色空间转换到另一个颜色空间。这种转换在图像处理中非常有用,因为不同的颜色空间对于特定的图像处理任务可能具有不同的优势。例如,在边缘检测中,灰度图像往往比彩色图像更有效。

#cv2.cvtColor()颜色空间转化
import cv2
image=cv2.imread('test.jpg')
image=cv2.cvtColor(src=image,code=cv2.COLOR_BGR2HSV)
#常用的颜色转化code
#BGR->Gray cv2.COLOR_BGR2GRAY​
#BGR->HSV cv2.COLOR_BGR2HSV
#BGR->RGB cv2.COLOR_BGR2RGB
#BGR->CMYK cv2.COLOR_BGR2CMYK

#RGB->BGR cv2.COLOR_RGB2BGR
#RGB->HSV cv2.COLOR_RGB2HSV
#RGB->GRAY cv2.COLOR_RGB2GRAY

#HSV->BGR cv2.COLOR_HSV2BGR
#HSV->RGB cv2.COLOR_HSV2RGB

#GRAY->BGR cv2.COLOR_GRAY2BGR
#GRAY->RGB cv2.COLOR_GRAY2RGB
cv2.imshow('image',image)
cv2.waitKey(0)
cv2.destroyAllWindows()

        我们常用的一些颜色空间有BGR,RGB,HSV,CMYK,GRAY这几种,在使用cv2.cvtColor()函数进行变换时,我们只需要按照cv2.COLOR_原颜色空间2新颜色空间的格式(2表示to)传入给code便可将图像从一种颜色空间转换到另一种。

将图像由BGR颜色空间变换到HSV空间后 


cv2.split():颜色通道提取

        颜色通道提取是图像处理中的一个基本且重要的步骤,它涉及到从图像中分离出红色、绿色、蓝色或其他颜色通道的信息。由于读取得到的图像结果是ndarray,因此我们既可以使用cv2内置函数split分离颜色通道,又可以使用切片的方式来获取三个颜色通道的信息。

import cv2
image=cv2.imread('test.jpg',cv2.IMREAD_UNCHANGED)
b,g,r=cv2.split(image)

直接使用cv2.split()函数对图像的3个颜色通道数据进行提取

import cv2
image=cv2.imread('test.jpg',cv2.IMREAD_UNCHANGED)
b,g,r=image[:,:,0],image[:,:,1],image[:,:,2]

 通过切片的方法对图像的3个颜色通道数据进行提取

二者得到的结果是一致的。 

  当然,如果我们只想保留图像在某个颜色通道上的数据,只需将该通道以外的所有数据置0即可。

import cv2
image=cv2.imread('test.jpg')
#将图像数据copy一份给blue_image,
#这样不会影响到后续可能要对原图像进行的操作
blue_image=image.copy()
blue_image[:,:,1]=blue_image[:,:,2]=0
cv2.imshow('blue_image',blue_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果


 cv2.resize():修改图像尺寸

        cv2的内置函数resize可以方便地调整图像的大小,值得注意的是,在修改图像尺寸时,为了尽量避免对图像质量造成过多的损失,可以通过选择适当的插值算法来保持图像的清晰度和细节。对此,cv2.resize函数的默认方法为

        放大时:cv2.INTER_CUBIC(双三次插值)

        缩小时:cv2.INTER_AREA(区域插值)

import cv2
import matplotlib.pyplot as plt
#plt.imshow的图像格式为RGB,因此读取图像数据时我们指定flags按照RGB格式
image=cv2.imread('test.jpg',cv2.IMREAD_COLOR_RGB)#原始图像大小为500x500
#resize函数参数:
image=cv2.resize(src=image, dsize=(600, 600),fx=2, fy=2, interpolation=cv2.INTER_CUBIC)
#src:原图像ndarray
#dsize元祖形式,指定图像的高和宽
#fx:x轴上图像放大或缩小倍数
#fy:y轴上图像放大或缩小倍数
#interploation:图像插值方法
#需要注意的是当dsize为(0,0)或不存在时,fx,fy才会起作用,也就是说resize函数优先使用dsize

#常用的interploation参数
#cv2.INTER_NEAREST:最近邻插值(速度快,但可能导致锯齿)
#cv2.INTER_LINEAR:双线性插值(默认,适用于大多数情况)
#cv2.INTER_CUBIC:双三次插值(高质量,计算成本较高)
#cv2.INTER_AREA:区域插值(缩小图像时效果较好)
#cv2.INTER_LANCZOS4:Lanczos插值(高质量,适用于放大)
plt.imshow(image)

cv2.resize()函数参数详解: 

 src原图像ndarray
 dsize元祖形式,指定调整后图像的高和宽
fxx轴上图像放大或缩小倍数
fyy轴上图像放大或缩小倍数
 interploation图像插值方法

   需要注意的是当dsize为(0,0)或不存在时,fx,fy才会起作用,也就是说resize函数优先使用dsize

                resize后的图像,原图像尺寸500x500,dsize=(0,0),按照fx,fy取值对图像大小进行调整


 cv2.addWeighted()图像融合

        在某些场景下我们需要对两张图片进行融合,考虑到图像经过cv2.imread()函数读取后均为ndarray,因此我们可以直接对两张图片的读取结果进行加减乘除运算,一般而言,图像进行融合时我们都采用线性融合的方式,比如我们可以直接将二者简单相加:

#图像融合,直接相加
import cv2
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
image1=cv2.imread('test.jpg',cv2.IMREAD_COLOR_RGB)
image2=cv2.imread('test1.jpg',cv2.IMREAD_COLOR_RGB)
image1=cv2.resize(image1,(800,800))
image2=cv2.resize(image2,(800,800))
newimage=image1+image2
print(image1[:3,:,0],'\n')
print(image2[:3,:,0],'\n')
print(newimage[:3,:,0])
plt.subplot(1,3,1),plt.imshow(image1),plt.title('图像1')
plt.subplot(1,3,2),plt.imshow(image2),plt.title('图像2')
plt.subplot(1,3,3),plt.imshow(newimage),plt.title('图像1+图像2')

 将两个图像直接相加

 结果

        当然,cv2还提供了addWeighted方法实现上述效果:

#图像融合,使用cv2.addWeighted函数
import cv2
plt.rcParams['font.sans-serif']=['SimHei']
image1=cv2.imread('test.jpg',cv2.IMREAD_COLOR_RGB)
image2=cv2.imread('test1.jpg',cv2.IMREAD_COLOR_RGB)
image1=cv2.resize(image1,(800,800))
image2=cv2.resize(image2,(800,800))
newimage=cv2.addWeighted(src1=image1,alpha=0.6,src2=image2,beta=0.8,gamma=5)
#src1:图像1
#alpha:图像1系数
#src2:图像2
#beta:图像2系数
#gamma;常数项
#newimage=0.5*image1+0.8*image2+5
plt.subplot(1,3,1),plt.imshow(image1),plt.title('图像1')
plt.subplot(1,3,2),plt.imshow(image2),plt.title('图像2')
plt.subplot(1,3,3),plt.imshow(newimage),plt.title('图像1+图像2')

   cv2.addWeighted()函数参数解析:

 src1图像1矩阵
alpha图像1系数
src2图像2矩阵
 beta图像2系数
 gamma常数项

   

 结果


cv2.merge()图像合并

        cv2.merge()是OpenCV库中的一个函数,主要用于将多个单通道图像合并为一个多通道图像。该函数通常接受一个包含若干图像的元组或列表作为输入,这些图像需要具有相同的尺寸。

#图像合并
import cv2
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
image=cv2.imread('test.jpg',cv2.IMREAD_COLOR_RGB)
r,g,b=cv2.split(image)#先将图片拆分为3个单通道的图像
merged_image=cv2.merge([r,g,b])#将3个单通道图像合并为原图像
#在合并单通道图像时需要将各个通道的图像数据按照元祖或列表的形式传入,且每个图像数据的尺寸需要一致
#合并后的图像shape为:(高,宽,各图像通道数之和)
plt.imshow(merged_image)

结果

        当然,多通道图像之间也可以合并,只要他们的形状一致即可,比如上述代码中的merged_image我们可以使用索引切片来将图像r+g与b这两个图像(2通道+1通道)进行合并。

randg=image[:,:,0:2]
b=image[:,:,2]
merged_image=cv2.merge([rang,b])

        但是,对于RGB图像而言,通道数最多不超过4(png图像多一个alpha通道),所以当你试图将两个RGB图象使用cv2.merge()函数合并后,无论是cv2.imshow()还是plt.imshow()都将无法正常显示图像,因为合并后的图像的通道数>=4.


cv2.copyMakeBorder()边界填充

        边界填充是图像处理中的一种常见操作,它通过在图像的边界周围添加额外的像素来改变图像的大小。这一操作在许多图像处理任务中都是必不可少的。在卷积神经网络(CNN)中进行图像分类或目标检测时,为了保持输入图像尺寸的一致性,常常需要对原始图像进行边界填充。此外,边界填充还可以用于创建图像的镜像效果,或者在图像拼接时减少接缝处的突兀感。

        cv2.copyMakeBorder函数便是opencv内置用来进行图像填充的函数,它可以在图像的四周或特定的一侧添加指定宽度和类型的边框。

#边界填充cv2.copyMakeBorder()
import cv2
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
image=cv2.imread('test.jpg',cv2.IMREAD_COLOR_RGB)
default=cv2.copyMakeBorder(src=image,top=20,bottom=20,left=20,right=20,borderType=cv2.BORDER_DEFAULT)
reflect=cv2.copyMakeBorder(src=image,top=20,bottom=20,left=20,right=20,borderType=cv2.BORDER_REFLECT)
isolated=cv2.copyMakeBorder(src=image,top=20,bottom=20,left=20,right=20,borderType=cv2.BORDER_ISOLATED)
wrap=cv2.copyMakeBorder(src=image,top=20,bottom=20,left=20,right=20,borderType=cv2.BORDER_WRAP)
replicate=cv2.copyMakeBorder(src=image,top=20,bottom=20,left=20,right=20,borderType=cv2.BORDER_REPLICATE)
reflect101=cv2.copyMakeBorder(src=image,top=20,bottom=20,left=20,right=20,borderType=cv2.BORDER_REFLECT101)
constant=cv2.copyMakeBorder(src=image,top=20,bottom=20,left=20,right=20,borderType=cv2.BORDER_CONSTANT,value=(10,250,120))#绿色边框
#cv2.copyMakeBorder()参数详解:
#src:原图像数据
#top:图像顶部要添加的边框宽度
#bottom:图像底部要添加的边框宽度
#left:图像左侧要添加的边框宽度
#right:图像右侧要添加的边框宽度
#borderType:填充方式
#value:当borderType为CONSTANT时候可用,对于灰度图像,它是一个标量值;对于彩色图像,它是一个包含三个值的元组(B, G, R)。
#所有填充方式:
#cv2.BORDER_CONSTANT: 添加一个固定颜色的边框,颜色由value参数指定
#cv2.BORDER_REPLICATE: 复制图像边缘的像素值来填充边框
#cv2.BORDER_REFLECT: 镜像反射图像边缘的像素值来填充边框
#cv2.BORDER_WRAP: 使用图像的另一侧的像素值来填充边框
#cv2.BORDER_DEFAULT: 默认的边框类型,通常与cv2.BORDER_REFLECT_101相同
#cv2.BORDER_REFLECT_101: 类似于 cv2.BORDER_REFLECT,但略有不同,通常用于避免重复的边缘像素。
#cv2.BORDER_ISOLATED:不处理边界,而是直接返回原始图像,即使传入了其他参数也被忽略。
fig,axs=plt.subplots(3,3,figsize=(10,8))
axs[0][0].imshow(image),axs[0][0].set_title('原图')
axs[0][1].imshow(default),axs[0][1].set_title('borderType=default')
axs[0][2].imshow(reflect),axs[0][2].set_title('borderType=reflect')
axs[1][0].imshow(isolated),axs[1][0].set_title('borderType=isolated')
axs[1][1].imshow(wrap),axs[1][1].set_title('borderType=wrap')
axs[1][2].imshow(replicate),axs[1][2].set_title('borderType=replicate')
axs[2][0].imshow(reflect101),axs[2][0].set_title('borderType=reflect101')
axs[2][1].imshow(constant),axs[2][1].set_title('borderType=constant')
plt.tight_layout()

 cv2.copyMakeBorder()函数参数详解

src

原图像数据

top

图像顶部要添加的边框宽度

bottom

图像底部要添加的边框宽度

left

图像左侧要添加的边框宽度

right

图像右侧要添加的边框宽度

broderType

填充方式

value

当borderType为CONSTANT时候可用,对于灰度图像,它是一个标量值,对于彩色图像,它是一个包含三个值的元组(B, G, R)BGR为三个颜色通道上的值。

 boderType常用参数

cv2.BORDER_CONSTANT

添加一个固定颜色的边框,颜色由value参数指定

cv2.BORDER_REPLICATE

复制图像边缘的像素值来填充边框

cv2.BORDER_REFLECT

镜像反射图像边缘的像素值来填充边框

cv2.BORDER_WRAP

使用图像的另一侧的像素值来填充边框

cv2.BORDER_DEFAULT

默认的边框类型,通常与cv2.BORDER_REFLECT_101相同

cv2.BORDER_REFLECT_101

类似于cv2.BORDER_REFLECT,但略有不同,通常用于避免重复的边缘像素

cv2.BORDER_ISOLATED

不处理边界,而是直接返回原始图像,即使传入了其他参数也被忽略

结果 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式Python版 备忘录模式

文章目录 前言一、备忘录模式二、备忘录模式示例1三、备忘录模式示例2 前言 GOF设计模式分三大类: 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式&#xff1a…

Linux红帽:RHCSA认证知识讲解(三)Linux基础指令与Vim编辑器的使用

Linux红帽:RHCSA认证知识讲解(三)Linux基础指令与Vim编辑器的使用 前言一、Linux基础指令二、Linux 文件系统层次结构概念三、通过路径指定文件四、使用命令行工具管理文件五、Vim 的安装方式六、Vim 的操作模式七、红帽建议掌握的 Vim 键和命…

auto.js例子之WebView多页面浏览器

"ui";ui.layout(<vertical><horizontal id"webs" layout_weight"1"></horizontal><button id"one" text"第一个" /><button id"two" text"第二个" /><button id"…

跨平台公式兼容性大模型提示词模板(飞书 + CSDN + Microsoft Word)

飞书云文档 CSDN MD编辑器 Microsoft Word 跨平台公式兼容方案&#xff1a; 一、背景痛点与解决方案 在技术文档创作中&#xff0c;数学公式的跨平台渲染一直存在三大痛点&#xff1a; 飞书云文档&#xff1a;原生KaTeX渲染与导出功能存在语法限制微软Word&#xff1a;Math…

HTTP 动态报错码的原因和解决方法

目录 1xx&#xff08;信息性状态码&#xff09; 2xx&#xff08;成功状态码&#xff09; 3xx&#xff08;重定向状态码&#xff09; 4xx&#xff08;客户端错误状态码&#xff09; 5xx&#xff08;服务器错误状态码&#xff09; 参考文章 以下是 HTTP 动态报错码的常见原…

Docker基础-常见命令

docker images -查看所有的本地镜像。 docker pull -把远端镜像拉取到本地。 docker rmi -删除镜像。 docker push -推到镜像仓库。 docker run -创建并运行容器&#xff08;自动化&#xff0c;如果发现镜像不存在会先去拉取&#xff0c; 拉取完了以后再去自动创建容器&am…

Spring MVC框架六:Ajax技术

精心整理了最新的面试资料&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 简介 jQuery.ajax Ajax原理 结语 创作不易&#xff0c;希望能对大家给予帮助 想要获取更多资源? 点击链接获取

36. Spring Boot 2.1.3.RELEASE 中实现监控信息可视化并添加邮件报警功能

1. 创建 Spring Boot Admin Server 项目 1.1 添加依赖 在 pom.xml 中添加 Spring Boot Admin Server 和邮件相关依赖&#xff1a; <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-w…

PowerShell 执行策略:fnm管理软件安装nodejs无法运行npm,错误信息:about_Execution_Policies

通过fnm管理软件安装NodeJS后添加环境变量依然无法执行npm,提示无法加载文件&#xff0c;错误如下&#xff1a; PowerShell 执行策略简介&#xff1a; PowerShell 执行策略是一项安全功能&#xff0c;用于控制 PowerShell 加载配置文件和运行脚本的条件。 此功能有助于防止恶…

Java在云计算平台中的应用研究

Java在云计算平台中的应用研究 随着云计算的广泛应用&#xff0c;越来越多的企业和开发者开始选择基于云计算的架构来构建和部署应用。Java作为一种成熟的编程语言&#xff0c;凭借其跨平台性、强大的生态系统以及优秀的并发处理能力&#xff0c;已成为云计算平台中常用的编程…

电脑键盘知识

1、键盘四大功能区 1. 功能区 2. 主要信息输入区 3. 编辑区 4. 数字键盘区 笔记本电脑键盘的功能区&#xff0c;使用前需先按Fn键 1.1、功能区 ESC&#xff1a;退出 F1&#xff1a;显示帮助信息 F2&#xff1a;重命名 F4&#xff1a;重复上一步操作 F5&#xff1a;刷新网页 …

论文阅读笔记:Continual Forgetting for Pre-trained Vision Models

论文阅读笔记&#xff1a;Continual Forgetting for Pre-trained Vision Models 1 背景2 创新点3 方法4 模块4.1 问题设置4.2 LoRA4.3 概述4.4 GS-LoRA4.5 损失函数 5 效果6 结论 1 背景 出于隐私和安全考虑&#xff0c;如今从预先训练的视觉模型中删除不需要的信息的需求越来…

C# 从基础神经元到实现在0~9数字识别

训练图片:mnist160 测试结果:1000次训练学习率为0.1时,准确率在60%以上 学习的图片越多&#xff0c;训练的时候越长(比如把 epochs*10 10000或更高时)效果越好 using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Windo…

蓝桥杯 5.字符串

蓝桥杯 5.字符串 文章目录 蓝桥杯 5.字符串KMP&字符串哈希Manacher编程138-148字典树基础01Trie编程149-155 KMP&字符串哈希 KMP算法 字符串匹配算法, 用于匹配**模式串P(短)和文本串S(长)**中出现的所有位置, 例如, S “ababac”, P “aba”, 那么出现的所有位置就…

AI智能体与大语言模型:重塑SaaS系统的未来航向

在数字化转型的浪潮中&#xff0c;软件即服务&#xff08;SaaS&#xff09;系统一直是企业提升效率、优化业务流程的重要工具。随着AI智能体和大语言模型&#xff08;LLMs&#xff09;的迅速发展&#xff0c;SaaS系统正迎来前所未有的变革契机。本文将从AI智能体和大语言模型对…

Jmeter聚合报告导出log文档,Jmeter聚合报告导出到CSV

Jmeter聚合报告导出log文档 在Filename中输入 EKS_perf_log\\${type}_log\\${__P(UNIQUEID,${__time(YMDHMS)})}\all-graph-results-log.csv 可以得到执行的log&#xff0c;文件夹包含时间戳 Jmeter聚合报告导出到CSV 点击Save Table Data&#xff0c;保存到CSV文件中

基于SpringBoot的“古城景区管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“古城景区管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统整体功能图 系统首页界面 系统注册界面 景…

第五项修炼:打造学习型组织

“没有哪个教室比得上一个充满问题的团队。” — 彼得圣吉 最近有伙伴问我们&#xff0c;如何在组织中践行《第五项修炼&#xff1a;打造学习型组织》&#xff1f;我想和大家分享的是&#xff0c;这不仅仅是“学习”&#xff0c;更是通过结构和行为的深度结合&#xff0c;推动绩…

ubuntu22.04的docker容器中安装ssh服务

ubuntu22.04的docker容器中安装ssh服务&#xff0c;以便外部可以连接到容器中操作。 rootnode15:~# cat /etc/issue Ubuntu 22.04.5 LTS \n \l rootnode15:~# docker ps|grep qwen 7d3c36c37d36 vllm/vllm-openai:v0.7.3 "python3 -m …

LabVIEW 中 codeGenEngine.llb 工具库

codeGenEngine.llb 是 LabVIEW 2019 安装目录下C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform\路径下的工具库&#xff0c;主要用于代码生成相关的操作&#xff0c;帮助开发者在 LabVIEW 项目中便捷地实现自动化代码生成任务&#xff0c;提高开发…