前文传送门:

「Python 图像处理 OpenCV (1):入门」

「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」

图像属性

图像属性包括行数,列数和通道数,图像数据类型,像素数等。

1. 形状:shape

图像的形状可以通过 shape 关键字进行获取,使用 shape 关键的后,获取的信息包括行数、列数、通道数的元祖。

需要注意的是,如果是灰度图片,只会返回图像的行数和列数,而彩色图片才会图像的行数、列数和通道数。

示例如下:

import cv2 as cv

# 读取彩色图片
color_img = cv.imread("maliao.jpg", cv.IMREAD_ANYCOLOR) print(color_img.shape) # 结果打印
(310, 560, 3) # 读取灰度图片
gray_img = cv.imread("maliao.jpg", cv.IMREAD_GRAYSCALE) print(gray_img.shape) # 结果打印
(310, 560)

2. 像素数量:size

图像的像素数量可以通过关键字 size 进行获取。

同样需要注意的是,灰度图片的像素数量是要小于彩色图片的,具体的关系是 1/3 。

import cv2 as cv

# 读取彩色图片
color_img = cv.imread("maliao.jpg", cv.IMREAD_ANYCOLOR) print(color_img.size) # 结果打印
520800 # 读取灰度图片
gray_img = cv.imread("maliao.jpg", cv.IMREAD_GRAYSCALE) print(gray_img.size) # 结果打印
173600

3. 图像类型-dtype

图像类型是通过关键字 dtype 获取的,通常返回 uint8 ,这个属性在彩色图片和灰度图片中是保持一致的。

注意 dtype 在调试时非常重要,因为 OpenCV-Python 代码中的大量错误是由无效的数据类型引起的。

import cv2 as cv

# 读取彩色图片
color_img = cv.imread("maliao.jpg", cv.IMREAD_ANYCOLOR) print(color_img.dtype) # 结果打印
uint8 # 读取灰度图片
gray_img = cv.imread("maliao.jpg", cv.IMREAD_GRAYSCALE) print(gray_img.dtype) # 结果打印
uint8

获取图像感兴趣 ROI 区域

ROI(Region of Interest)表示感兴趣区域。

它是指从被处理图像以方框、圆形、椭圆、不规则多边形等方式勾勒出需要处理的区域。可以通过各种算子(Operator)和函数求得感兴趣ROI区域,并进行图像的下一步处理,被广泛应用于热点地图、人脸识别、图像分割等领域。

如果我们要对于图像中的眼睛检测,首先对整个图像进行人脸检测。在获取人脸图像时,我们只选择人脸区域,搜索其中的眼睛,而不是搜索整个图像。它提高了准确性(因为眼睛总是在面部上:D )和性能(因为我们搜索的区域很小)。

我们通过像素矩阵可以直接得到 ROI 区域,如: img[200:400, 200:400]

比如下面这个示例我们获取马里奥的脸,然后再把它显示出来:

import cv2 as cv

img = cv.imread("maliao.jpg", cv.IMREAD_UNCHANGED)

face = img[10:175, 100:260]

# 原始图像显示
cv.imshow("demo", img) # 马里奥的脸显示
cv.imshow("face", face) #等待显示
cv.waitKey(0)
cv.destroyAllWindows()

它的结果如下:

如果我们要把这两张图像合成一张图像,可以对图像进行区域赋值:

import cv2 as cv

img = cv.imread("maliao.jpg", cv.IMREAD_UNCHANGED)

# 获取 ROI 区域
face = img[10:175, 100:260]
# 图像赋值
img[0:165, 0:160] = face # 原始图像显示
cv.imshow("demo", img) #等待显示
cv.waitKey(0)
cv.destroyAllWindows()

结果如下:

这里我稍微偷点懒,直接就把 ROI 区域放在了图片的左上角,这个位置可以随意指定,但是指定的区域要和 ROI 的区域一样大,否则会报一个 ValueError 的错误。

拆分和合并图像通道

1. 拆分图像通道

有些时候,我们需要分别处理图像的 B,G,R 通道。的通道,用 PS 抠过图的人应该都清楚抠图的时候可以使用单通道进行抠图操作。

将图像的通道拆分出来可以使用 split() 函数,如下:

import cv2 as cv

img = cv.imread("maliao.jpg", cv.IMREAD_UNCHANGED)

#拆分通道
b, g, r = cv.split(img) # 分别显示三个通道的图像
cv.imshow("B", b)
cv.imshow("G", g)
cv.imshow("R", r) # 等待显示
cv.waitKey(0)
cv.destroyAllWindows()

结果如下:

可以看到,三个通道的图像看起来都是灰白色的,这个玩过 PS 的人应该都很熟悉。

除了使用 split() 函数获取图像通道,还可以通过索引进行获取,代码如下:

b = img[:, :, 0]
g = img[:, :, 1]
r = img[:, :, 2]

如果需要将所有红色像素都设置为零,无需先拆分通道,索引更快:

img[:, :, 2] = 0

注意: split() 函数是一项耗时的操作(就时间而言)。因此,仅在必要时才这样做。否则请进行Numpy索引。

2. 合并图像通道

合并图像通道我们使用函数 merge() ,示例如下:

import cv2 as cv

img = cv.imread("maliao.jpg", cv.IMREAD_UNCHANGED)

# 拆分通道
b, g, r = cv.split(img) # 合并图像通道
m = cv.merge([r, g, b]) cv.imshow('merge', m) # 等待显示
cv.waitKey(0)
cv.destroyAllWindows()

结果如下:

这里如果是按照 [r, g, b] 进行图像通道合并,我们的马里奥就会变身成为蓝精灵,因为 OpenCV 是按照 BGR 读取的,如果想要显示会原图,合并的时候也按照 [b, g, r] 合并即可,如下:

如果我们想要做一个真正的蓝精灵,可以只提取 B 颜色通道,其余两个 G 、 R 通道全部设置为 0 ,这样,我们就获得了一个真正的蓝精灵(整个图像只有蓝色通道),代码如下:

import cv2 as cv
import numpy as np # 读取图片
img = cv.imread("maliao.jpg", cv.IMREAD_UNCHANGED)
rows, cols, chn = img.shape # 拆分通道
b = img[:, :, 0]
g = np.zeros((rows,cols), dtype=img.dtype)
r = np.zeros((rows,cols), dtype=img.dtype) # 合并图像通道
m = cv.merge([b, g, r]) cv.imshow('merge', m) # 等待显示
cv.waitKey(0)
cv.destroyAllWindows()

结果如下:

同理,如果想要绿精灵和红精灵,一样可以做出来。

示例代码

如果有需要获取源码的同学可以在公众号回复「OpenCV」进行获取。

参考

https://blog.csdn.net/eastmount/article/details/82177300

http://woshicver.com/

Python 图像处理 OpenCV (3):图像属性、图像感兴趣 ROI 区域及通道处理的更多相关文章

  1. 跟我学Python图像处理丨获取图像属性、兴趣ROI区域及通道处理

    摘要:本篇文章主要讲解Python调用OpenCV获取图像属性,截取感兴趣ROI区域,处理图像通道. 本文分享自华为云社区<[Python图像处理] 三.获取图像属性.兴趣ROI区域及通道处理 ...

  2. Python图像处理:如何获取图像属性、兴趣ROI区域及通道处理

    摘要:本篇文章主要讲解Python调用OpenCV获取图像属性,截取感兴趣ROI区域,处理图像通道. 本文分享自华为云社区<[Python图像处理] 三.获取图像属性.兴趣ROI区域及通道处理 ...

  3. Python 图像处理 OpenCV (4):图像算数运算以及修改颜色空间

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  4. Python 图像处理 OpenCV (5):图像的几何变换

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  5. Python 图像处理 OpenCV (6):图像的阈值处理

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  6. Python 图像处理 OpenCV (14):图像金字塔

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  7. Python 图像处理 OpenCV (15):图像轮廓

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  8. Python 图像处理 OpenCV (16):图像直方图

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  9. Python 图像处理 OpenCV (7):图像平滑(滤波)处理

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

随机推荐

  1. asList和ArrayList不得不说的故事

    目录 简介 创建ArrayList UnsupportedOperationException asList 转换 总结 asList和ArrayList不得不说的故事 简介 提到集合类,ArrayL ...

  2. pfSense®2.4.4发布后,原pfSense 黄金会员的服务将免费使用!

    2018年7月16日,Doug McIntire 从即将发布的pfSense®2.4.4开始,之前在"pfSense Gold"下提供的所有服务都将继续,但所有pfSense用户都 ...

  3. C# 对 TCP 客户端的状态封装

    TCP客户端连接TCP服务器端有几种应用状态: 与服务器的连接已建立 与服务器的连接已断开 与服务器的连接发生异常 应用程序可按需求合理处理这些逻辑,比如: 连接断开后自动重连 连接断开后选择备用地址 ...

  4. 数学--数论--欧拉降幂--P5091 欧拉定理

    题目背景 出题人也想写有趣的题面,可惜并没有能力. 题目描述 给你三个正整数,a,m,ba,m,ba,m,b,你需要求:ab mod ma^b \bmod mabmodm 输入格式 一行三个整数,a, ...

  5. P1460 健康的荷斯坦奶牛 Healthy Holsteins (简单的dfs)

    题目描述 农民JOHN以拥有世界上最健康的奶牛为傲.他知道每种饲料中所包含的牛所需的最低的维他命量是多少.请你帮助农夫喂养他的牛,以保持它们的健康,使喂给牛的饲料的种数最少. 给出牛所需的最低的维他命 ...

  6. poj1679 The Unique MST(最小生成树唯一性)

    最小生成树的唯一性,部分参考了oi-wiki 如果一条不在最小生成树边集内的边,它可以替换一条在最小生成树边集内,且权值相等的边,那么最小生成树不是唯一的 同过kruskal来判断 考虑权值相等的边, ...

  7. B. Preparing for Merge Sort

    \(考虑的时候,千万不能按照题目意思一组一组去模拟\) \(要发现每组的最后一个数一定大于下一组的最后一个数\) \(那我们可以把a中的数一个一个填充到vec中\) #include <bits ...

  8. P2774 方格取数问题 网络流重温

    P2774 方格取数问题 这个题目之前写过一次,现在重温还是感觉有点难,可能之前没有理解透彻. 这个题目要求取一定数量的数,并且这些数在方格里面不能相邻,问取完数之后和最大是多少. 这个很好的用了网络 ...

  9. oracle常用数学函数

    数学函数 ABS:(返回绝对值) --返回绝对值 select abs(-1.11) from dual; CEIL:(向上取整) --向上取整 select ceil(3.1415) from du ...

  10. 【Hadoop离线基础总结】MapReduce倒排索引建立

    MapReduce倒排索引建立 求某些单词在文章中出现多少次 有三个文档的内容,求hello,tom,jerry三个单词在其中各出现多少次 hello tom hello jerry hello to ...