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

news2025/2/27 18:46:42

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

示例图片 

目录

常见图像预处理方法

灰度化处理

法一

 法二

 说明

切片截取部分图像数据 

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

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

结果 

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

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

相关文章

采用DDNS-GO与cloudflare实现双域名同时访问NAS

这个标题其实解释的还不够清楚,本人是小白,但是买了群晖的NAS后自己瞎折腾了一下,遇到了如下的问题: 1、家里是移动宽带,没有公网IP,因此Ipv4无法使用,IPV6可以正常使用。 2、办公室场地采用的…

w803|联盛德|WM IoT SDK2.X测试|pinout|(2):w803开发板简介

概述 W803-Pico是一款基于联盛德W803芯片为主控的开发板,支持IEEE802.11 b/g/n Wi-Fi,以及BT/BLE4.2协议蓝牙。芯片内置高性能32位处理器,主频高达240MHz。内置2MB Flash以及288KB RAM。硬件采用DIP封装,PCB板载天线,…

【UCB CS 61B SP24】Lecture 16 - Data Structures 2: ADTs, BSTs学习笔记

本文首先介绍了抽象数据类型与树的概念,接着重点讲解二叉搜索树的定义与操作方式,并用 Java 实现一个标准的二叉搜索树结构。 1. 抽象数据类型 首先引入一个概念叫做抽象数据类型(Abstract Data Type,ADT)&#xff0…

Java 大视界 -- Java 大数据在智能物流路径规划与车辆调度中的创新应用(102)

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

HarmonyOS Design 介绍

HarmonyOS Design 介绍 文章目录 HarmonyOS Design 介绍一、HarmonyOS Design 是什么?1. 设计系统(Design System)2. UI 框架的支持3. 设计工具和资源4. 开发指南5. 与其他设计系统的对比总结 二、HarmonyOS Design 特点 | 应用场景1. Harmon…

【算法系列】快速排序详解

文章目录 快速排序的多种实现方式1. 基本快速排序(Lomuto 分区方案)1.1 基本原理1.2 步骤1.3 Java 实现示例 2. Hoare 分区方案2.1 基本原理2.2 步骤2.3 Java 实现示例 3. 三数取中法3.1 基本原理3.2 步骤3.3 Java 实现示例 4. 尾递归优化4.1 基本原理4.…

电脑键盘知识

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

Grok 3 vs. DeepSeek vs. ChatGPT:2025终极AI对决

2025 年,AI 领域的竞争愈发激烈,三个重量级选手争夺霸主地位:Grok 3(由 xAI 开发)、DeepSeek(国内 AI 初创公司)和 ChatGPT(OpenAI 产品)。每个模型都有自己独特的优势,无论是在深度思考、速度、编程辅助、创意输出,还是在成本控制方面,都展现出强大的实力。但究竟…

【MySQL篇】数据库基础

目录 1,什么是数据库? 2,主流数据库 3,MySQL介绍 1,MySQL架构 2,SQL分类 3,MySQL存储引擎 1,什么是数据库? 数据库(Database,简称DB&#xf…

基于SpringBoot+mybatisplus+vueJS的Cosplay文化展示与交流社区设计与实现

博主介绍:硕士研究生,专注于信息化技术领域开发与管理,会使用java、标准c/c等开发语言,以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年,拥有近12年的管理工作经验,拥有较丰富的技术架…

组件传递props校验

注意&#xff1a;prop是只读的&#xff01;不可以修改父组件的数据。 可以检验传过来的内容是否类型没问题。 App.vue <template><div><!-- <parentDemo/> --><componentA/></div></template> <script> import ComponentA …

数据结构与算法-图论-最短路-拓展运用

选择最佳路线 分析&#xff1a; 这是一道图论中的最短路径问题&#xff0c;目标是在给定的公交网络中&#xff0c;找到从琪琪家附近的车站出发&#xff0c;到她朋友家附近车站&#xff08;编号为 s &#xff09;的最短时间。以下是对该问题的详细分析&#xff1a; 问题关键信息…

0—QT ui界面一览

2025.2.26&#xff0c;感谢gpt4 1.控件盒子 1. Layouts&#xff08;布局&#xff09; 布局控件用于组织界面上的控件&#xff0c;确保它们的位置和排列方式合理。 Vertical Layout&#xff08;垂直布局&#xff09; &#xff1a;将控件按垂直方向排列。 建议&#xff1a;适…

纷析云:赋能企业财务数字化转型的开源解决方案

在企业数字化转型的浪潮中&#xff0c;财务管理的高效与安全成为关键。纷析云凭借其开源、安全、灵活的财务软件解决方案&#xff0c;为企业提供了一条理想的转型路径。 一、开源的力量&#xff1a;自主、安全、高效 纷析云的核心优势在于其100%开源的财务软件源码。这意味着…

P8716 [蓝桥杯 2020 省 AB2] 回文日期

1 题目说明 2 题目分析 暴力不会超时&#xff0c;O(n)的时间复杂度&#xff0c; < 1 0 8 <10^8 <108。分析见代码&#xff1a; #include<iostream> #include<string> using namespace std;int m[13]{0,31,28,31,30,31,30,31,31,30,31,30,31};// 判断日期…

(十)趣学设计模式 之 外观模式!

目录 一、 啥是外观模式&#xff1f;二、 为什么要用外观模式&#xff1f;三、 外观模式的实现方式四、 外观模式的优缺点五、 外观模式的应用场景六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&#xff0c;可以多多支…

apache-maven-3.2.1

MAVEN_HOME D:\apache-maven-3.2.1 PATH D:\apache-maven-3.2.1\bin cmd mvn -v <localRepository>d:\localRepository</localRepository> setting.xml <?xml version"1.0" encoding"UTF-8"?><!-- Licensed to the Apache Soft…

编程题-连接两字母单词得到的最长回文串(中等)

题目&#xff1a; 给你一个字符串数组 words 。words 中每个元素都是一个包含 两个 小写英文字母的单词。 请你从 words 中选择一些元素并按 任意顺序 连接它们&#xff0c;并得到一个 尽可能长的回文串 。每个元素 至多 只能使用一次。 请你返回你能得到的最长回文串的 长度…

论文笔记(七十二)Reward Centering(三)

Reward Centering&#xff08;三&#xff09; 文章概括摘要3 基于值的奖励中心化4 案例研究&#xff1a; 以奖励为中心的 Q-learning5 讨论、局限性与未来工作致谢 文章概括 引用&#xff1a; article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan…

【论文笔记-ECCV 2024】AnyControl:使用文本到图像生成的多功能控件创建您的艺术作品

AnyControl&#xff1a;使用文本到图像生成的多功能控件创建您的艺术作品 图1 AnyControl的多控制图像合成。该研究的模型支持多个控制信号的自由组合&#xff0c;并生成与每个输入对齐的和谐结果。输入到模型中的输入控制信号以组合图像显示&#xff0c;以实现更好的可视化。 …