600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > opencv python3 找图片色块_Python 图像处理 OpenCV (3):图像属性 图像感兴

opencv python3 找图片色块_Python 图像处理 OpenCV (3):图像属性 图像感兴

时间:2024-05-17 08:22:56

相关推荐

opencv python3 找图片色块_Python 图像处理 OpenCV (3):图像属性 图像感兴

前文传送门:

图像属性

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

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 进行获取。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 ,这个属性在彩色图片和灰度图片中是保持一致的。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

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」进行获取。

参考

opencv python3 找图片色块_Python 图像处理 OpenCV (3):图像属性 图像感兴趣 ROI 区域及通道处理...

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。