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

【opencv-Python学习笔记(2): 图像表示;图像通道分割;图像通道合并;图像属性】

目标:1.学会图像的通道分割与合并

           2.学会图像的的常规操作

##一些概念:

二值图像:只包含黑色和白色两种颜色的图像,1为白色,0为黑色

灰度图像:计算机会将灰度处理为256个灰度级,用区间[0,255]来表示。其中255表达纯白 色,0表示纯黑色。

彩色图像:由于色彩空间不一致,导致彩色图像的表示也不一致,以RGB图像为例,由三个  通道组成,R通道,G通道,B通道,每个色彩的通道值处于[0,255],经过不同的组合共有 256*256*256=16777216种颜色。但是在opencv中,图像通道是按照 B,G,R排列的

1. 通道操作

为什么需要通道操作?

有时候,需要将图像的通道数进行分割处理,在opencv中,图像通道是按照 B,G,R排列的

方法:分为索引拆分和通过函数拆分,主要讲解函数拆分

函数cv2.spilt(img)

import cv2lean=cv2.imread("1.JPG")
b,g,r=cv2.split(lean)   # 与下面的写法是一致的# b1=cv2.split(lean)[0]
# g1=cv2.split(lean)[1]
# r1=cv2.split(lean)[2]cv2.imshow("B",b)
cv2.imshow("G",g)
cv2.imshow("R",r)
cv2.waitKey(0)
cv2.destroyAllWindows()

注意事项:上述代码呈现的图片大小不能调,下面的是可以手动调大小的

import cv2result=cv2.imread("1.JPG")
b,g,r=cv2.split(result)    #分割图像,将图像按照B,G,R的通道进行拆分
cv2.namedWindow('11',cv2.WINDOW_NORMAL)  # 需要自定义个窗体,正常模式
cv2.namedWindow('12',cv2.WINDOW_NORMAL)
cv2.namedWindow('13',cv2.WINDOW_NORMAL)
cv2.imshow("11",b)
cv2.imshow("12",g)
cv2.imshow("13",r)
cv2.waitKey(0)
cv2.destroyAllWindows()

2. 通道合并

说明:通道合并是通道拆分的逆过程,例如将三个通道的灰度图像构成 一副彩色图像。

为什么需要通道合并?

有时候可能需要两个通道合并或者多个通道合并,图像在opencv中是按照B,G,R的顺序进行排列的,可以先对图像进行拆分操作,在按照R,G,B的顺序进行合并。

函数:cv2.merge(mv)

解释:参数mv为单通道图像或者列表,每个通道的图像长和款应该相同

import cv2result=cv2.imread("1.JPG")
b,g,r=cv2.split(result)    #分割图像,将图像按照B,G,R的通道进行拆分
cv2.namedWindow('11',cv2.WINDOW_NORMAL)  # 需要自定义个窗体,正常模式
cv2.namedWindow('12',cv2.WINDOW_NORMAL)
#cv2.namedWindow('13',cv2.WINDOW_NORMAL)bgr=cv2.merge([b,g,r])
rgb=cv2.merge([r,g,b])cv2.imshow("11",bgr)
cv2.imshow("12",rgb)
#cv2.imshow("13",r)
cv2.waitKey(0)
cv2.destroyAllWindows()

3. 图像属性

下面仅介绍常用的图像属性

shape:如果是彩色图像,则返回行数、列数、通道数的数组,若是二值图像或者灰度图像                 则只返回行数和列数

size:返回图像的像素数,其值为 “行x列x通道数”,灰度图像或者二值图像通道数为1

dtype:返回图像的数据类型

### 图像的高和宽分别对应着列数和行数。

  • 高度(Height)=行数
  • 宽度(Width)=列数

如何获取图像的长和宽?

import cv2# 读取图像(返回的是 numpy 数组)
img = cv2.imread("image.jpg")# 获取图像的高度(行数)和宽度(列数)
height, width = img.shape[:2]  # 取前两个值,分别是高度和宽度print(f"图像宽度(列数):{width}")
print(f"图像高度(行数):{height}")

如何统一图像的大小?如何批量统一图像的嗯大小?

函数:cv2.resize(src, dsize, fx=0, fy=0, interpolation=cv2.INTER_LINEAR)

参数作用
src输入图像(numpy 数组)
dsize目标尺寸,格式为 (宽度, 高度)(如 (640, 480)
fx/fy水平 / 垂直方向的缩放比例(若指定,则 dsize 需设为 None
interpolation插值方法(决定缩放时如何计算新像素值,影响结果质
import cv2
import os
from glob import globdef resize_images(input_dir, output_dir, target_size=(640, 480)):"""批量调整图像大小:param input_dir: 原始图像所在文件夹:param output_dir: 调整后图像的保存文件夹:param target_size: 目标尺寸 (宽度, 高度)"""# 创建输出文件夹(如果不存在)os.makedirs(output_dir, exist_ok=True)# 获取文件夹中所有图片(支持常见格式)image_paths = glob(os.path.join(input_dir, "*.[jpgnJPGEpngPNG]"))for img_path in image_paths:# 读取图像img = cv2.imread(img_path)if img is None:print(f"无法读取图像: {img_path}")continue# 调整图像大小# interpolation参数:缩放时的插值方法# - cv2.INTER_AREA: 适合缩小图像(推荐)# - cv2.INTER_CUBIC: 适合放大图像(质量更高但速度慢)# - cv2.INTER_LINEAR: 线性插值(默认,平衡速度和质量)resized_img = cv2.resize(img, target_size, interpolation=cv2.INTER_AREA)# 保存调整后的图像img_name = os.path.basename(img_path)output_path = os.path.join(output_dir, img_name)cv2.imwrite(output_path, resized_img)print(f"已保存: {output_path}")# 使用示例
if __name__ == "__main__":input_folder = "原始图片文件夹路径"  # 替换为你的输入文件夹output_folder = "调整后图片文件夹路径"  # 替换为你的输出文件夹target_width = 800    # 目标宽度target_height = 600   # 目标高度resize_images(input_folder, output_folder, (target_width, target_height))


http://www.lryc.cn/news/618267.html

相关文章:

  • 云原生应用的DevOps3(CI/CD十大安全风险、渗透场景)
  • LeetCode 2787.将一个数字表示成幂的和的方案数:经典01背包
  • 小红书笔记信息获取_实在智能RPA源码解读
  • 使用 NetBird 创建安全的私有网络,简化远程连接!
  • 完整多端口 Nginx Docker部署 + GitLab Runner注册及标签使用指南
  • 从原理到实践:一文掌握Kafka的消息生产与消费
  • Unity:GUI笔记(一)——文本、按钮、多选框和单选框、输入框和拖动条、图片绘制和框绘制
  • 从零部署Nacos:替代Eureka的服务注册与服务发现基础教程
  • WPS文字和Word:不只是表格,段落也可以排序
  • 文字转语音 edge_tts
  • 微内核与插件化设计思想及其在前端项目中的应用
  • PostgreSQL 范围、空间唯一性约束
  • 用 Apache Iceberg 与 Apache Spark 在 Google Cloud 打造高性能、可扩展的数据湖仓
  • Flink运行时的实现细节
  • SQL 语言分类
  • Spark 运行流程核心组件(一)作业提交
  • 数据量暴涨时,抓取架构该如何应对?
  • 开发npm包【详细教程】
  • Bevy渲染引擎核心技术深度解析:架构、体积雾与Meshlet渲染
  • C++Linux八股
  • 08--深入解析C++ list:高效操作与实现原理
  • K8S 节点初始化一键脚本(禁用 SELinux + 关闭 swap + 开启 ipvs 亲测实用)
  • 微前端架构:原理、场景与实践案例
  • 前端JS处理时间,适用于聊天、操作记录等(包含刚刚、x分钟前、x小时前、x天前)
  • Windows已经安装了一个MySQL8,通过修改配置文件的端口号跑2个或多个Mysql服务方法,并注册为系统服务
  • lesson36:MySQL从入门到精通:全面掌握数据库操作与核心原理
  • 嵌入式系统学习Day17(文件编程)
  • 项目实战2——LAMP_LNMP实践
  • 智能化评估体系:数据生产、在线化与自动化的三重奏
  • 解锁 Appium Inspector:移动端 UI 自动化定位的利器