OpenCV-Python(9):图像基础操作

目录

学习目标

获取图像像素并修改像素值

获取图像属性 

图像ROI

拆分及合并图像通道

图像边缘扩充


学习目标

  • 获取像素值并修改
  • 获取图像的属性(信息)
  • 图像的ROI获取
  • 图像通道拆分及合并
  • 图像扩边

获取图像像素并修改像素值

        几乎所有这些操作与Numpy 的关系要比与OpenCV 的关系更加紧密,因此熟练Numpy 可以帮助我们写出性能更好的代码。通常可以根据像素的行和列的坐标获取他的像素值。对BGR 图像而言,返回值分别为B、G、R 的值。对灰度图像而言,会返回他的灰度值(亮度),下面代码展示如何获取图像的像素:

# 导入必要的库
import cv2
import numpy as np# 根据图片路径读入图像
img=cv2.imread('/home/duan/workspace/opencv/images/roi.jpg')# 获取某一位置三通道像素的值
px=img[100,100]
print (px)# 获取某一位置蓝色通道的值
blue=img[100,100,0]
print (blue)# 结果展示
## [57 63 68]
## 57

可以使用以下方式修改像素值:

img[100,100]=[255,255,255]
print (img[100,100])
# 结果如下
## [255 255 255]

 警告:Numpy 是经过优化了的快速矩阵运算的软件包。所以我不推荐逐个获取像素值并修改,这样会很慢,能有矩阵运算就不要用循环。

注意:上面提到的方法通常用来选取矩阵的一个区域,比如图像前5行的后3列。对于获取每一个像素值,也可使用Numpy 的array.item() 和array.itemset() 会更好。但是返回值是标量。如果你想获得所有B、G、R 的值,你可以使用array.item() 分割他们。

获取像素值及修改的更好方法如下:

import cv2
import numpy as npimg=cv2.imread('/home/duan/workspace/opencv/images/roi.jpg')print (img.item(10,10,2))
img.itemset((10,10,2),100)
print (img.item(10,10,2))
## 50
## 100

获取图像属性 

        图像的属性值一般包括以下内容:

  1. 尺寸:图像的尺寸指的是图像的宽度和高度,通常用像素(pixel)表示。例如,一个图像的尺寸可以为640x480,表示宽度为640像素,高度为480像素。
  2. 通道数:彩色图像通常由红、绿、蓝三个通道组成,每个通道表示一种颜色分量。灰度图像只有一个通道,表示图像的亮度。通道数可以用来区分彩色图像和灰度图像。
  3. 数据类型:图像的像素值可以用不同的数据类型来表示,例如无符号整数(unsigned integer)或浮点数(float)。常见的数据类型有8位无符号整数(uint8)、16位无符号整数(uint16)、32位浮点数(float32)等。
  4. 像素值范围:图像的像素值范围取决于数据类型,例如8位无符号整数的像素值范围为0-255,16位无符号整数的像素值范围为0-65535。像素值范围可以用来判断图像的亮度级别。
  5. 位深度:图像的位深度指的是每个像素所占用的比特数。例如,8位图像的位深度为8,表示每个像素由8个比特表示。位深度可以影响图像的色彩精度和灰度级别。
  6. 颜色空间:彩色图像可以使用不同的颜色空间来表示颜色信息,常见的颜色空间有RGB、HSV、Lab等。不同的颜色空间可以表示不同的颜色分量,例如RGB颜色空间使用红、绿、蓝三个分量表示颜色。

        以上是图像的一些常见属性值,不同的图像处理库可能会提供更多的属性信息。在进行图像处理时,对这些属性值的理解和操作是非常重要的。下面介绍OpenCV中常见的图像属性处理,包括:行、列、通道、图像数据类型、图像素数目等。
img.shape 可以获取图像的形状。他的返回回值是一个包含行数、列数、通道数的元组。

print (img.shape)
## (280, 450, 3)

 注意:如果图像是灰度图,返回值仅有行数和列数。所以通过检查这个函数返回值就可以知道加载的 是灰度图还是彩色图。

 img.size 可以返回图像的像素数目。

print (img.size)
## 378000

img.dtype 返回的是图像的数据类型. 

print (img.dtype)
## uint8

注意:在除虫(debug)时img.dtype 非常重要。因为在OpenCVPython代码中经常出现数据类型的不一致。

图像ROI

        有时你需要对一幅图像的特定区域进行操作。例如我们要检测一副图像中眼睛的位置,我们应先应先在图像中找到脸,再在脸的区域中找眼睛,而不是直接在一幅图像中搜索,这样会提高程序的准确性和性能。ROI 也是使用Numpy 索引来获得的。现在我们􄦸选择择球的部分并把他拷贝到图像的其他区域。

import cv2
import numpy as np
img=cv2.imread('/home/duan/workspace/opencv/images/roi.jpg')
ball=img[280:340,330:390]
img[273:333,100:160]=bal

拆分及合并图像通道

        有时我们需要对BGR 三个通道分别进行操作。这时你就需要把BGR 拆分成单个通道。有时你需要把独立通道的图片合并成一个BGR 图像。你可以这样做:

import cv2
import numpy as np
img=cv2.imread('/home/duan/workspace/opencv/images/roi.jpg')
b,g,r=cv2.split(img)
img=cv2.merge(b,g,r)

或者这样:

import cv2
import numpy as np
img=cv2.imread('/home/duan/workspace/opencv/images/roi.jpg')
b=img[:,:,0]

 假如你想使所有像素的红色通道值都为0,你不必先拆分再赋值。你可以直接使用Numpy 索引会更快。

import cv2
import numpy as np
img=cv2.imread('/home/duan/workspace/opencv/images/roi.jpg')
img[:,:,2]=0

 警告:cv2.split() 是一个比较耗时的操作。只有真正需要时才用它,能用Numpy 索引就尽量用。

图像边缘扩充

        如果你想在图像周围创建一个边,就像相框一样,你可以使用cv2.copyMakeBorder()函数。这经常在卷积运算或0 填充时被用到。cv2.copyMakeBorder()函数是OpenCV中用于在图像周围创建边框的函数。该函数可以用于在图像的上、下、左、右四个方向上添加指定大小和类型的边框。

函数的语法如下:

dst = cv2.copyMakeBorder(src, top, bottom, left, right, borderType, value)

参数说明:

  • src:输入图像,可以是任意尺寸和通道数的图像。
  • top:顶部边框的大小,以像素为单位。
  • bottom:底部边框的大小,以像素为单位。
  • left:左侧边框的大小,以像素为单位。
  • right:右侧边框的大小,以像素为单位。
  • borderType:边框类型,可以是以下值之一:
    • cv2.BORDER_CONSTANT:常数边框,边框像素值为指定的value
    • cv2.BORDER_REPLICATE:复制边框,边框像素值为最边缘像素的值。
    • cv2.BORDER_REFLECT:反射边框,边框像素值沿边界反射。
    • cv2.BORDER_REFLECT_101:反射边框,边框像素值沿边界反射,但是排除边界像素。
    • cv2.BORDER_WRAP:环绕边框,边框像素值沿边界环绕。
  • value:当borderTypecv2.BORDER_CONSTANT时,用于指定边框像素值的常数。

函数返回的是添加了边框的图像。为了更好的理􄎒􄦈几种类型􄖦看下􅄑的演示程序:

import cv2
import numpy as np
from matplotlib import pyplot as plt
BLUE=[255,0,0]
img1=cv2.imread('intro.png')
replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP)
constant= cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE)
plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL')
plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE')
plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT')
plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101')
plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP')
plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT')
plt.show()

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

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

相关文章

【电商项目实战】MD5登录加密及JSR303自定义注解

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《电商项目实战》。🎯🎯 &am…

飞书文档如何转markdown

飞书文档如何转markdown 实现效果实现步骤其他方法 实现效果 导出的结果挂在这了 https://thinkasany.github.io/docs/#/ 实现步骤 以https://upyun.feishu.cn/docx/KERsd1DpioPb1xxye9VcuXbhnBC这篇文章为例 使用工具 https://github.com/Wsine/feishu2md,提供了…

案例-旋转的太极图案(HTML+CSS)

使用css的动画变换效果完成“ 旋转太极“。 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>*{margin: 0;padding: 0;background-color: antiquewhite;}.tj{width: 0;height: 300px;/* border…

AWTK 开源串口屏开发(4) - 采用数据

AWTK 开源串口屏开发 - 数据采集 1. 功能 数据采集是一个常用的功能&#xff0c;MCU 定时采集数据&#xff08;如环保设备定时采样空气中的污染物&#xff09;&#xff0c;并发送采样数据到串口屏&#xff0c;串口屏可以显示采样数据&#xff0c;也可以对采样数据进行管理&am…

68.乐理基础-打拍子-大附点与变体

上一节内容&#xff1a;66.乐理基础-打拍子-小切分-CSDN博客&#xff0c;只所以没有67因为67可以不用知道&#xff0c;67节内容在&#xff1a;※-打拍子&#xff08;8&#xff09;-一拍内的变体1-乐理教程-腾讯课堂 (qq.com) 大附点&#xff1a;大附点这个名字不是通用的&…

基于element-ui table组件的二次封装

文章目录 配置数据基础分析封装 el-table-column使用插槽强化结语 相信 element-ui 大家都有所耳闻&#xff0c;table 也是老朋友了&#xff0c;不过在使用它的时候大家是怎么使用的呢&#xff1f;是直接在官网上cv使用吗&#xff1f;这种方式&#xff0c;我相信写起来会有点小…

【教学类-43-02】20231226 九宫格数独2.0(n=9)(ChatGPT AI对话大师生成 回溯算法)

作品展示&#xff1a; 背景需求&#xff1a; 大4班20号说&#xff1a;我不会做这种&#xff08;九宫格&#xff09;&#xff0c;我做的是小格子的&#xff0c; 他把手工纸翻过来&#xff0c;在反面自己画了矩阵格子。向我展示&#xff1a; “我会做这种&#xff01;” 原来他…

OCR在审核应用落地

本文字数&#xff1a;6686字 预计阅读时间&#xff1a;35分钟 01 背景 1、业务背景 在传统视频审核场景中&#xff0c;审核人员需要对进审视频中的文字内容进行逐一审核&#xff0c;避免在文字上出现敏感词、违禁词或者广告等相关词汇。这种人工审核费时费力&#xff0c;并且由…

python+django网上购物商城系统o9m4k

语言&#xff1a;Python 框架&#xff1a;django/flask可以定制 软件版本&#xff1a;python3.7.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发工具pycharm/vscode都可以 前端框架:vue.js 系统使用过程主要涉及到管理员和用户两种角色&#xff0c;主要包含个…

TSR勾画学习

1&#xff1a;勾画建议 文献&#xff1a;Scoring the tumor-stroma ratio in colon cancer: procedure and recommendations 主要讲述的是结肠癌(CRC)的勾画建议和流程。 1&#xff0c;切片选择建议&#xff1a; 原发肿瘤的载玻片最具侵袭性的部分&#xff08;即常规病理学…

PiflowX组件-ReadFromKafka

ReadFromKafka组件 组件说明 从kafka中读取数据。 计算引擎 flink 有界性 Unbounded 组件分组 kafka 端口 Inport&#xff1a;默认端口 outport&#xff1a;默认端口 组件属性 名称展示名称默认值允许值是否必填描述例子kafka_hostKAFKA_HOST“”无是逗号分隔的Ka…

【目标检测】yolov8结构及代码分析

yolov8代码:https://github.com/ultralytics/ultralytics yolov8的整体结构如下图&#xff08;来自mmyolo&#xff09;&#xff1a; yolov8的配置文件&#xff1a; # Ultralytics YOLO &#x1f680;, AGPL-3.0 license # YOLOv8 object detection model with P3-P5 outputs.…

偏好对齐RLHF-OpenAI·DeepMind·Anthropic对比分析

OpenAI paper: InstructGPT, Training language models to follow instructions with human feedback paper: Learning to summarize from human feedback Introducing ChatGPT 解密Prompt系列4介绍了InstructGPT指令微调的部分&#xff0c;这里只看偏好对齐的部分 样本构建…

Zookeeper-Zookeeper特性与节点数据类型详解

1.Zookeeper介绍 ZooKeeper 是一个开源的分布式协调框架&#xff0c;是Apache Hadoop 的一个子项目&#xff0c;主要用来解决分布式集群中应用系统的一致性问题。Zookeeper 的设计目标是将那些复杂目容易出错的分布式一致性服务封装起来&#xff0c;构成一高效可靠的原语集&…

Python列表的介绍与操作 增改查,连接,赋值,复制,清空

列表 在日常中我们通过给变量赋值来存储数据,比如 a "hello" b "world" c "你好啊" d "....."由于变量一次只能存储一个数据,但我们如果想一次存储多个数据,的话这样存储会很复杂,所以,我们可以通过列表 列表(List)是Python中的…

Linux驱动开发学习笔记6《蜂鸣器实验》

目录 一、蜂鸣器驱动原理 二、硬件原理分析 三、实验程序编写 1、 修改设备树文件 &#xff08;1&#xff09;添加pinctrl节点 &#xff08;2&#xff09;添加BEEP设备节点 &#xff08;3&#xff09;检查PIN 是否被其他外设使用 2、蜂鸣器驱动程序编写 3、编写测试AP…

基于js和html的骰子游戏

介绍&#xff1a; 1.游戏者选择“大”时&#xff0c;三个骰子点数之和为11-18时&#xff0c;游戏者获胜。2.游戏者选择“小”时&#xff0c;三个骰子点数之和为3-10时&#xff0c;游戏者获胜。3.如果游戏者选择具体点数&#xff0c;则根据三个骰子的点数计算&#xff0c;如果与…

Linux 安装Jupyter notebook 并开启远程访问

文章目录 安装Python安装pip安装Jupyter启动Jupyter Notebook1. 生成配置文件2. 创建密码3. 修改jupyter notebook的配置文件4. 启动jupyter notebook5. 远程访问jupyter notebook 安装Python 确保你的系统上已经安装了Python。大多数Linux发行版都预装了Python。你可以在终端…

【深度学习-图像分类】02 - AlexNet 论文学习与总结

论文地址&#xff1a;ImageNet Classification with Deep Convolutional Neural Networks 论文学习 1. 摘要 本研究训练了一个大型深度卷积神经网络&#xff08;CNN&#xff09;&#xff0c;用于对ImageNet LSVRC-2010比赛中的1.2百万高分辨率图像进行分类&#xff0c;这些图…

MYSQL 深入探索系列六 SQL执行计划

概述 好久不见了&#xff0c;近期一直在忙项目的事&#xff0c;才有时间写博客&#xff0c;近期频繁出现sql问题&#xff0c;今天正好不忙咱们看看千万级别的表到底该如何优化sql。 案例 近期有个小伙伴生产环境收到了告警&#xff0c;有个6千万的日志表&#xff0c;查询耗时大…