当前位置: 首页 > article >正文

图像处理篇---基本Python图像处理


文章目录

  • 前言
  • 1. 图像灰度化
    • 原理
    • Python 实现
  • 2. 图像二值化
    • 原理:
    • Python 实现
  • 3. 图像掩膜(Mask)
    • 原理
    • Python 实现
  • 4. 腐蚀(Erosion)和膨胀(Dilation)
    • 原理
    • Python 实现
  • 5. 其他常用图像操作
    • (1) 图像缩放
    • (2) 图像旋转
    • (3) 图像平滑(模糊)
    • (4) 边缘检测(Canny)
    • (5) 轮廓检测
  • 6. 总结
  • 总结


前言

以上就是今天要讲的内容,本文仅仅简单介绍了基本Python图像处理:灰度化、二值化、掩码、腐蚀膨胀、缩放、旋转、高斯平滑、边缘检测、轮廓检测。


1. 图像灰度化

灰度化是将彩色图像转换为灰度图像的过程。灰度图像只有一个通道,每个像素的值表示亮度(0 为黑色,255 为白色)。

原理

将彩色图像的 RGB 通道转换为灰度值,常用的公式为:
Gray=0.299×R+0.587×G+0.114×B

Python 实现

import cv2#读取彩色图像
image = cv2.imread("image.jpg")#灰度化
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)#显示结果
cv2.imshow("Gray Image", gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

2. 图像二值化

二值化是将灰度图像转换为黑白图像的过程。通过设定一个阈值,将像素值分为两类(0 或 255)

原理:

设定一个阈值 T,将像素值 x 转换为:
𝑥={255 if 𝑥≥𝑇 ;0 if 𝑥<𝑇}

Python 实现

import cv2#读取灰度图像
gray_image = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE)#二值化
_, binary_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)#显示结果
cv2.imshow("Binary Image", binary_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

3. 图像掩膜(Mask)

掩膜是通过一个二值图像(掩膜)提取原图像中感兴趣区域的操作

原理

掩膜是一个二值图像,白色区域(255)表示保留的区域,黑色区域(0)表示忽略的区域。

通过按位与操作,将掩膜应用到原图像上。

Python 实现

import cv2
import numpy as np#读取图像
image = cv2.imread("image.jpg")#创建掩膜(白色区域为感兴趣区域)
mask = np.zeros(image.shape[:2], dtype=np.uint8)cv2.rectangle(mask, (100, 100), (300, 300), 255, -1)  # 在掩膜上绘制白色矩形

mask = np.zeros(image.shape[:2], dtype=np.uint8)
np.zeros(…): 这是一个NumPy函数,用于创建一个指定形状和数据类型的新数组,并将其所有元素初始化为0。
image.shape[:2]: image 是一个已经存在的图像变量,它有一个属性 shape,这个属性是一个元组,表示图像的维度。在灰度图像或RGB图像的情况下,shape 会返回一个元组,如 (高度, 宽度, 颜色通道数)。通过 image.shape[:2],我们只取这个元组的前两个元素,即图像的高度和宽度,这样就可以创建一个与图像同样大小的二维数组。
dtype=np.uint8: 这里指定了数组的数据类型为 np.uint8,即8位无符号整数,取值范围为0到255。这是图像处理中常用的数据类型,因为每个像素的颜色值通常用0到255的整数表示。
这条语句的结果是创建了一个与输入图像 image 的高度和宽度相同,但只有一个颜色通道(即二维)的数组 mask,该数组的所有元素都是0。

cv2.rectangle(mask, (100, 100), (300, 300), 255, -1)
cv2.rectangle(…): 这是OpenCV库中的一个函数,用于在图像上绘制矩形。
mask: 这是第一个参数,表示要在其上绘制矩形的图像。在这个例子中,我们在之前创建的 mask 数组上绘制矩形。
(100, 100): 这是矩形的起始坐标点(左上角)。在这个例子中,矩形的左上角位于图像的(100, 100)位置。
(300, 300): 这是矩形的结束坐标点(右下角)。矩形的右下角位于图像的(300, 300)位置。
255: 这是矩形内部的颜色值。由于 mask 是一个uint8类型的数组,颜色值255表示白色。
-1: 这个参数表示矩形边框的粗细。如果这个值是负数,OpenCV会填充整个矩形为指定的颜色(在这里是白色)。如果这个值是正数或0,它将定义矩形边框的宽度。
这条语句的结果是在 mask 数组上绘制了一个白色矩形,其左上角位于(100, 100),右下角位于(300, 300)。由于使用了 -1 作为边框粗细的值,矩形内部被完全填充为白色(255),而矩形外部仍然是黑色(0)。这个 mask 可以用于图像处理中的各种操作,比如选择图像的某个区域进行进一步处理。

#应用掩膜
masked_image = cv2.bitwise_and(image, image, mask=mask)#显示结果
cv2.imshow("Masked Image", masked_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

4. 腐蚀(Erosion)和膨胀(Dilation)

腐蚀和膨胀是形态学操作,用于处理二值图像中的前景对象。

原理

腐蚀:用**结构元素(kernel)**扫描图像,如果结构元素覆盖的区域全是前景(255),则保留中心像素,否则置为 0。

膨胀:用结构元素扫描图像,如果结构元素覆盖的区域有至少一个前景(255),则置中心像素为 255。

Python 实现

import cv2
import numpy as np#读取二值图像
binary_image = cv2.imread("binary_image.jpg", cv2.IMREAD_GRAYSCALE)#定义结构元素(kernel)
kernel = np.ones((5, 5), np.uint8)#腐蚀
eroded_image = cv2.erode(binary_image, kernel, iterations=1)#膨胀
dilated_image = cv2.dilate(binary_image, kernel, iterations=1)#显示结果
cv2.imshow("Eroded Image", eroded_image)
cv2.imshow("Dilated Image", dilated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

5. 其他常用图像操作

(1) 图像缩放

resized_image = cv2.resize(image, (new_width, new_height))

(2) 图像旋转

(h, w) = image.shape[:2]
center = (w // 2, h // 2)
matrix = cv2.getRotationMatrix2D(center, angle, scale)  # angle: 旋转角度, scale: 缩放比例
rotated_image = cv2.warpAffine(image, matrix, (w, h))

(3) 图像平滑(模糊)

blurred_image = cv2.GaussianBlur(image, (kernel_size, kernel_size), 0)

(4) 边缘检测(Canny)

edges = cv2.Canny(image, threshold1, threshold2)  # threshold1 和 threshold2 是阈值

edges: 这是一个新的图像变量,它将存储边缘检测的结果。edges 图像将是一个二值图像,其中边缘位置以白色(像素值为255)表示,非边缘位置以黑色(像素值为0)表示。
cv2.Canny(…): 这是 OpenCV 中的 Canny 边缘检测函数,用于检测图像中的边缘。
image: 这是输入图像,可以是灰度图像或者彩色图像。如果输入是彩色图像,通常在应用 Canny 函数之前将其转换为灰度图像,因为边缘检测通常在灰度空间中进行。
threshold1: 这是第一个阈值参数,用于边缘连接。较小的阈值 threshold1 用于检测图像中的强边缘。
threshold2: 这是第二个阈值参数,用于边缘连接。较大的阈值 threshold2 用于检测图像中的弱边缘。
Canny 边缘检测算法的工作原理如下:
降噪:通常在进行边缘检测之前,会先对图像进行降噪处理,比如使用高斯模糊来减少图像噪声的影响。
计算梯度:算法计算图像中每个像素点的梯度大小和方向。梯度的大小表示边缘的强度,而方向表示边缘的方向。
非极大值抑制:在计算梯度后,算法会应用非极大值抑制,以细化边缘。这意味着只有梯度强度在特定方向上是局部最大值的像素点才会被考虑为边缘。
双阈值:在这一步,会使用两个阈值(threshold1 和 threshold2)来确定哪些边缘是“真正”的边缘。梯度强度高于 threshold2 的像素点被标记为强边缘,梯度强度低于 threshold1 的像素点被抑制(即不是边缘)。位于这两个阈值之间的像素点,如果它们与强边缘相连,则会被标记为弱边缘。
边缘跟踪和连接:最后,算法会跟踪弱边缘,并将它们连接到强边缘上,以形成完整的边缘。
通过调整 threshold1 和 threshold2 的值,可以控制边缘检测的灵敏度。较小的 threshold1 值和较大的 threshold2 值可以检测到更多的边缘,但可能会增加噪声;而较大的 threshold1 值和较小的 threshold2 值可能会错过一些边缘,但会减少噪声的影响。
因此,edges = cv2.Canny(image, threshold1, threshold2) 这条语句的目的是在输入图像 image 上应用 Canny 边缘检测算法,并使用 threshold1 和 threshold2 作为边缘检测的阈值,最终将检测到的边缘存储在 edges 图像变量中。

(5) 轮廓检测

contours, _ = cv2.findContours(binary_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contour_image = cv2.drawContours(image.copy(), contours, -1, (0, 255, 0), 2)

6. 总结

  1. 灰度化:将彩色图像转换为灰度图像
  2. 二值化:将灰度图像转换为黑白图像
  3. 掩膜:提取图像中的感兴趣区域
  4. 腐蚀和膨胀:形态学操作,用于处理二值图像
  5. 其他操作:缩放、旋转、平滑、边缘检测、轮廓检测等。
    通过 OpenCV 和 NumPy,可以轻松实现这些图像处理操作。

总结

以上就是今天要讲的内容,本文仅仅简单介绍了基本Python图像处理:灰度化、二值化、掩码、腐蚀膨胀、缩放、旋转、高斯平滑、边缘检测、轮廓检测。

相关文章:

图像处理篇---基本Python图像处理

文章目录 前言1. 图像灰度化原理Python 实现 2. 图像二值化原理&#xff1a;Python 实现 3. 图像掩膜&#xff08;Mask&#xff09;原理Python 实现 4. 腐蚀&#xff08;Erosion&#xff09;和膨胀&#xff08;Dilation&#xff09;原理Python 实现 5. 其他常用图像操作(1) 图像…...

使用PHP爬虫获取1688商品分类:实战案例指南

在电商领域&#xff0c;商品分类信息是商家进行市场调研、选品分析和竞争情报收集的重要基础。1688作为国内领先的B2B电商平台&#xff0c;提供了丰富且详细的商品分类数据。通过PHP爬虫技术&#xff0c;我们可以高效地获取这些分类信息&#xff0c;为商业决策提供有力支持。 …...

【微服务学习二】nacos服务发现与负载均衡

nacos服务发现 想要开启服务发现&#xff0c;需要在main函数上添加 EnableDiscoveryClient 注解 然后我们编写一个controller类来查询nacos中注册的所有微服务以及对应的ip端口号 Controller public class DiscoveryController {AutowiredDiscoveryClient discoveryClient;//…...

深入剖析推理模型:从DeepSeek R1看LLM推理能力构建与优化

著名 AI 研究者和博主 Sebastian Raschka 又更新博客了。原文地址&#xff1a;https://sebastianraschka.com/blog/2025/understanding-reasoning-llms.html。这一次&#xff0c;他将立足于 DeepSeek 技术报告&#xff0c;介绍用于构建推理模型的四种主要方法&#xff0c;也就是…...

有哪些滤波,原理是什么,分别在什么时候用

均值滤波&#xff08;Average Filtering&#xff09; 原理&#xff1a;通过计算像素点邻域内像素值的平均值来作为该像素点滤波后的新值。例如&#xff0c;对于一个 3x3 的邻域&#xff0c;将 9 个像素值相加然后除以 9 得到滤波后的像素值。优点&#xff1a;简单易实现&#x…...

小初高各学科教材,PDF电子版下载

链接&#xff1a;https://pan.quark.cn/s/7c2125f648e2 小初高中电子课本资料pdf合集 高中各科教材 &#xff08;部分举例&#xff09; - 语文&#xff1a;新人教版、旧人教版、苏教版等 - 数学&#xff1a;人教A版、沪教版、鄂教版等 - 英语&#xff1a;重大版、人教版…...

Kafka分区管理大师指南:扩容、均衡、迁移与限流全解析

#作者&#xff1a;孙德新 文章目录 分区分配操作(kafka-reassign-partitions.sh)1.1 分区扩容、数据均衡、迁移(kafka-reassign-partitions.sh)1.2、修改topic分区partition的副本数&#xff08;扩缩容副本&#xff09;1.3、Partition Reassign场景限流1.4、节点内副本移动到不…...

java后端开发day14--之前练习的总结和思考

1.感受 这两天学点儿新的就直接上手打代码&#xff0c;真的是累死个人。我唯一的感受就是&#xff0c;课听完了&#xff0c;代码也跟着打完了&#xff08;是的&#xff0c;跟着打的&#xff0c;没自己打&#xff09;&#xff0c;感觉自己脑袋里乱乱的&#xff0c;对代码的分区…...

[运输时间]

运输时间 真题目录: 点击去查看 E 卷 200分题型 题目描述 M(1 ≤ M ≤ 20)辆车需要在一条不能超车的单行道到达终点,起点到终点的距离为 N(1 ≤ N ≤ 400)。 速度快的车追上前车后,只能以前车的速度继续行驶,求最后一辆车到达目的地花费的时间。 注:每辆车固定间隔…...

【愚公系列】《Python网络爬虫从入门到精通》008-正则表达式基础

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…...

理解 WebGPU 中的 GPUQueue:GPU 的命令队列

在现代图形编程中&#xff0c;与 GPU 的交互变得越来越高效和灵活&#xff0c;而 WebGPU API 的出现更是为 Web 开发者带来了强大的图形处理能力。其中&#xff0c; GPUQueue 作为 WebGPU 的核心接口之一&#xff0c;扮演着至关重要的角色。本文将详细介绍 GPUQueue 的概…...

AIoT时代来临,物联网技术如何颠覆未来生活?

在这个万物互联的时代&#xff0c;“物联网”&#xff08;IoT&#xff09;正以前所未有的速度改变我们的生活&#xff0c;而“AIoT”则是在物联网基础上融入人工智能技术&#xff0c;赋予设备更高的智能和自主决策能力。随着5G、边缘计算和云技术的不断发展&#xff0c;物联网正…...

基于SpringBoot的电影院售票管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

CanMV的刷新比Openmv强

今天使用CanMV k230的板子&#xff0c;发现CanMV的刷新比Openmv强&#xff0c;速度快&#xff0c;不用再次拍照刷新&#xff0c;写一次就能在ide屏幕上同时显示。 参考一下CanMV K230拍照保存Demo - CanMV&#xff08;K210 / K230&#xff09; - 01科技 | 01Studio Takephot(…...

深度学习与人工智能:解锁未来的无限可能

在当今这个科技飞速发展的时代&#xff0c;深度学习和人工智能已不再只是科幻小说中的概念&#xff0c;它们正以惊人的速度渗透到我们生活的方方面面&#xff0c;从智能手机上的语音助手到医疗领域的疾病诊断&#xff0c;从自动驾驶汽车到金融市场的风险预测&#xff0c;其影响…...

广东茂名能源国际会议(IS-ESE 2025)

能源科学与工程国际研讨会&#xff08;IS-ESE 2025&#xff09;将于4月18-20日中国茂名召开&#xff0c;聚焦能源科学与工程&#xff0c;录用文章将由IOP出版并提交EI索引&#xff0c;旨在促进国际合作与交流&#xff0c;诚邀海内外专家学者参会。 征稿主题集中但不限于“能源…...

2025年02月14日Github流行趋势

项目名称&#xff1a;data-formulator 项目地址url&#xff1a;https://github.com/microsoft/data-formulator项目语言&#xff1a;TypeScript历史star数&#xff1a;5921今日star数&#xff1a;820项目维护者&#xff1a;Chenglong-MS, danmarshall, apps/dependabot, micros…...

MySQL-SQL

1.客户端内置命令 客户端内置命令客户端独有&#xff0c;可能不同数据库产品的客户端内置命令存在很大差异&#xff0c;不像SQL命令有标准规范。 help \h ? \? 这四个命令都可以输出帮助文档查看客户端内置命令 &#xff1f;&#xff08;\&#xff1f;&#xff09;“帮助”…...

华为云+硅基流动使用Chatbox接入DeepSeek-R1满血版671B

华为云硅基流动使用Chatbox接入DeepSeek-R1满血版671B 硅基流动 1.1 注册登录 1.2 实名认证 1.3 创建API密钥 1.4 客户端工具 OllamaChatboxCherry StudioAnythingLLM 资源包下载&#xff1a; AI聊天本地客户端 接入Chatbox客户端 点击设置 选择SiliconFloW API 粘贴1.3创…...

一文详解机器视觉环形光源,视觉检测中的环形光源应用

环形光源 是机器视觉系统中常用的一种照明设备,通常用于提供均匀、无阴影的照明,特别适合检测物体的表面特征、边缘和轮廓。以下是关于环形光源的详细介绍: 环形光源的结构与特点 结构:环形光源由多个 LED 灯珠均匀排列成环形,通常安装在相机镜头周围。 光源的内径和外径…...

动态建表并插入数据

Service层根据解析到的数据在Mysql数据库中动态建表并插入数据 以Easy Excel解析得到的文件为例 Slf4j Service public class ExcelImportServiceImpl implements ExcelImportService {Autowired private ExcelImportDao dao; Value("${source.url}") private Stri…...

【github】docker realtime

Linux和Docker实时指南&#xff0c;适用于Ubuntu实时内核和PREEMPT_RT ReadMe.md 作者&#xff1a;Tobit Flatscher&#xff08;2021 - 2024&#xff09; 概述 本指南解释了如何在Linux操作系统内开发/部署运行实时代码的Docker容器。因此&#xff0c;它会带你了解&#xf…...

MySQL官网驱动下载(jar包驱动和ODBC驱动)【详细教程】

1.打开MySQL的官网&#xff0c;选择下载(Download) MySQL[这里是图片001]https://www.mysql.com/cn/ 2.往下划点击MySQL Community(GPL)Downloads 3.要下载MySQL的jar包的选择Connector/J 4.进入后&#xff0c;根据自己的需求选择相应的版本 5.下载完成后&#xff0c;进行解压…...

jenkins服务启动-排错

服务状态为active (exited) 且进程不在 查看/etc/rc.d/init.d/jenkins配置 获取配置参数 [rootfy-jenkins-prod jenkins]# cat /etc/rc.d/init.d/jenkins | grep -v #JENKINS_WAR"/usr/lib/jenkins/jenkins.war" test -r "$JENKINS_WAR" || { echo "…...

JavaScript设计模式 -- 适配器模式

在软件开发中&#xff0c;经常会遇到这样的情况&#xff1a;现有的类或第三方库提供的接口与系统中期望的接口不匹配。如果直接修改已有代码风险较大或者不可行&#xff0c;这时适配器模式&#xff08;Adapter Pattern&#xff09;就能派上用场。适配器模式通过创建一个包装类&…...

Redis7.0八种数据结构底层原理

导读 本文介绍redis应用数据结构与物理存储结构,共八种应用数据结构和 一. 内部数据结构 1. sds sds是redis自己设计的字符串结构有以下特点: jemalloc内存管理预分配冗余空间二进制安全(c原生使用\0作为结尾标识,所以无法直接存储\0)动态计数类型(根据字符串长度动态选择…...

细说STM32F407单片机RTC的备份寄存器原理及使用方法

目录 一、备份寄存器的功能 二、示例功能 三、项目设置 1、晶振、DEBUG、CodeGenerator、USART6 2、RTC 3、NVIC 4、GPIO 及KEYLED 四、软件设计 1、main.h 2、main.c 3、rtc.c 4、keyled.c、keyled.h 五、运行调试 本实例旨在介绍备份寄存器的作用。本实例继续使…...

spring 学习 (注解)

目录 前言 常用的注解 须知 1 Conponent注解 demo&#xff08;案例&#xff09; 2 ControllerServiceRepository demo(案例&#xff09; 3 ScopeLazyPostConstructPreDestroy demo(案例&#xff09; 4 ValueAutowiredQualifierResource demo(案例&#xff09; 5 Co…...

html+css设计情人节网页制作主页页面

制作一个情人节主题的网页主页是一个有趣的项目。以下是一个简单的HTML和CSS示例,帮助你开始。这个示例包括一个基本的情人节主题网页,包含标题、一些浪漫的背景图像、以及一些情人节相关的内容。 HTML部分 <!DOCTYPE html> <html lang="zh-CN"> <…...

【Linux】多线程 -> 从线程概念到线程控制

线程概念 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“一个进程内部的控制序列”。一切进程至少都有一个执行线程。线程在进程内部运行&#xff0c;本质是在进程地址空间内运行。在Linux系统中&#xff0c;在CPU眼…...