opencv-python学习【2】图像处理基础

一.图像的基本表示方法

1.二值图像

  二值图像指的是仅仅包含黑色和白色两种颜色的图像。在计算机中,通过矩阵数组来表示和处理图像,矩阵的每一个位置元素就是一个独立的处理单位,称其为像素点。计算机将白色像素点处理为“1”,黑色像素点处理为“0”,方便后续的操作。由于二值图像只有黑色和白色两种颜色,因此只用一个比特位(0或1)就能表示。

2.灰度图像

  二值图像简单方便,但是只有黑白两种颜色,表示的图像不够细腻,,更多的颜色种类才能表示更细腻的图片。如下图是一幅灰度图像,采用更多地数值 0到255 来表示图像。

  计算机将灰度处理为256个灰度级,用数值区间 [0, 255] 来表示。其中 “0” 表示纯黑色,“255” 表示纯白色,其余的数值表示从纯黑到纯白之间不同级别的灰度。

3.彩色图像

  比起二值图像和灰度图像,彩色图像是更常见的一类图像,能表现更加丰富的细节信息。
  从不同的角度表述颜色,可以得到不同的色彩空间(也称为颜色空间、颜色模式)。而 RGB 色彩空间是我们常用的色彩空间,在 RGB 色彩空间中,存在 R(red,红色)通道、 G(green,绿色)通道、 B(blue,蓝色)通道,每个色彩通道的值都是在 [0, 255] 之间,我们用这三个色彩通道组合来表示彩色颜色。由于每个通道都有 256 种数值,所以可以组合成 256x256x256=16777216 种颜色。下表为常见的几种组合颜色。

R G B RGB 颜色
0 0 0 (0,0,0) 纯白
255 255 255 (255,255,255) 纯黑
255 0 0 (255,0,0) 红色
0 255 0 (0,255,0) 绿色
0 0 255 (0,0,255) 蓝色
139 69 19 (139,69,19) 棕色
114 141 216 (114,141,216) 天蓝色

  如下图所示,在彩色图的某个像素点的值为 (256,89,68) ,这个三个值分别对应为 R、G、B 三个通道的值,三个值组合起来形成了我们看到的彩色。(注意在opencv中读取图像后,图像默认会转为BGR格式)

二.图像像素处理

  像素是图像构成的基本单位,通过对数组位置索引的形式可以对图像内的元素进行访问,处理。

三.通道操作

  针对RGB图像,我们可以拆分出 R、G、B 三个通道,先读取原彩色图片img = cv2.imread('dog.jpg')(注意此时的图片为 BGR 通道顺序)。此时 img 为三维矩阵 img.shape = (512,512,3),部分值如下图所示:

1.通道拆分

(1).通过索引拆分

b = img[:, :, 0]	# 获取图像的 B 通道
g = img[:, :, 1]	# 获取图像的 G 通道
r = img[:, :, 2]	# 获取图像的 R 通道

img[:, :, 0] = 1	# 将图像 B 通道的值设为1
img[:, :, 1] = 0	# 将图像 G 通道的值设为0
img[:, :, 2] = 10	# 将图像 R 通道的值设为10

(2).通过函数拆分

b,g,r = cv2.split(img)
###或者写成一下形式###
b = cv2.split(img)[0]	# 获取图像的 B 通道
g = cv2.split(img)[1]	# 获取图像的 G 通道
r = cv2.split(img)[2]	# 获取图像的 R 通道

  此时 b,g,r 都分别为二维矩阵 b.shape = (512,512),部分值如下图所示:

2.通道合并

  通道合并是通道拆分的逆过程,可以将三个通道的灰度图合并来构成一幅彩色图像。

b,g,r = cv2.split(img)
bg_img = cv2.merge([b,g])
rgb_img = cv2.merge([r,g,b])

  此时 bg_img 为三维矩阵 bg.shape =(512, 512, 2),部分值如下图所示:

  此时 rgb_img 为三维矩阵 rgb.shape =(512, 512, 3),部分值如下图所示:

3.获取图像属性

img = cv2.imread('xxx.png')

  • img.shape:如果是彩色图,返回 (行数, 列数, 通道数) 的三元组;如果是灰度图,返回 (行数, 列数) 的二元组
  • img.size:返回图像的像素数目。值为 “行数 x 列数 x 通道数”
  • img.dtype:返回图像的数据类型

示例

import cv2

bgr = cv2.imread('dog.jpg')
print(bgr.shape)
print(type(bgr.shape))
print(bgr.size)
print(bgr.dtype)

gray = cv2.cvtColor(bgr,cv2.COLOR_BGR2GRAY)
print(gray.shape)
print(type(gray.shape))
print(gray.size)
print(gray.dtype)

'''结果如下
(512, 512, 3)
<class 'tuple'>
786432
uint8

(512, 512)
<class 'tuple'>
262144
uint8
'''

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340