Python-OpenCV对图像的遍历操作示例代码

Python-OpenCV对图像的遍历操作示例代码。

本文是对博文 四种方式实现对OpenCV的MAT类矩阵元素的遍历 的拓展。

Python-OpenCV中以numpy库的中ndarray对象存储图像数据,所以在Python-OpenCV中对图像的遍历就是对ndarray对象的遍历。

咱们要想正确对ndarray对象进行遍历,需要有以下基础知识:
对Numpy库ndarray对象(矩阵)中的数据的访问、选取操作示例积累
numpy库中ndarray对象切片操作的参数意义
Python的Numpy库的ndarray对象(矩阵)初始化、属性调整、属性获取、基本操作示例代码积累

01-对二维灰度图像的遍历操作

第一种方法:用循环操作遍历每一个像素,然后对像素值进行操作
示例代码如下:
代码中用到的图像下载链接:https://pan.baidu.com/s/1SPxGouOli-XbBYfr-IJ9nw?pwd=dwch

# 博主微信/QQ 2487872782
# 有问题可以联系博主交流
# 有图像处理需求也请联系博主
# 图像处理技术交流QQ群 271891601

# !/usr/bin/env python
# -*- coding: utf-8 -*-
# OpenCV的版本为4.4.0

import cv2 as cv
import numpy as np

image_gray = cv.imread('F:/material/images/2022/2022-06/ring.bmp', 0)

cv.imshow('image_gray', image_gray)

img_row = image_gray.shape[0]
img_col = image_gray.shape[1]

# 利用遍历操作对二维灰度图作取反操作
for i in range(img_row):
    for j in range(img_col):
        temp1 = image_gray[i, j]
        image_gray[i, j] = 255-temp1

cv.imshow('image_gray_reverse', image_gray)

cv.waitKey(0)
cv.destroyAllWindows()

运行结果如下图所示:
在这里插入图片描述
第二种:利用ndarray的减号运算符一句话实现:
关于ndarray的矩阵运算,大家可以参考下面这篇博文:
Python的Numpy库中各种矩阵基本运算的示例代码(加、减、乘、点乘、点除、乘方、转置等)
示例代码如下:

# !/usr/bin/env python
# -*- coding: utf-8 -*-
# OpenCV的版本为4.4.0

import cv2 as cv
import numpy as np

image_gray = cv.imread('F:/material/images/2022/2022-06/ring.bmp', 0)

cv.imshow('image_gray', image_gray)

image_gray = 255 - image_gray

cv.imshow('image_gray_reverse', image_gray)

cv.waitKey(0)
cv.destroyAllWindows()

运行结果如下:
在这里插入图片描述

02-对三通道图像的遍历操作

对下面这幅图像进行操作:
请添加图片描述
图像中的三个圆分别为纯红圆、纯绿圆和纯蓝圆。
上面这幅图像百度网盘下载链接:https://pan.baidu.com/s/1pQS7P6EWYqGMMRX_2lx1cw?pwd=1rrs

首先我们看下上面这幅图在ndarray中的存储结构:
在这里插入图片描述
从上面的存储结构可以看出,第一个维度为图像的行数,第二个维度为图像的列数,第三个维度为图像的通道数。
知道上面这个存储结构后,我们才能更有的放矢的进行操作。

我们的目标是把上面这幅图像中的红色圆去掉。

第一种方法:通过循环操作遍历每一个像素的R通道,将其值置为0实现。
代码如下:

# 博主微信/QQ 2487872782
# 有问题可以联系博主交流
# 有图像处理需求也请联系博主
# 图像处理技术交流QQ群 271891601

# !/usr/bin/env python
# -*- coding: utf-8 -*-
# OpenCV的版本为4.4.0

import cv2 as cv
import numpy as np

image = cv.imread('F:/material/images/2022/2022-06/BGR_circle.bmp')

cv.imshow('image', image)

img_row = image.shape[0]
img_col = image.shape[1]

# 利用遍历像素操作将红色通道的值全部置为0
for i in range(img_row):
    for j in range(img_col):
        image[i, j, 2] = 0

cv.imshow('image_none_R', image)

cv.waitKey(0)
cv.destroyAllWindows()

运行结果如下图所示:
在这里插入图片描述
第二种方法:用切片操作将红色通道全部置为0(这种方法一句话就搞定)

# 博主微信/QQ 2487872782
# 有问题可以联系博主交流
# 有图像处理需求也请联系博主
# 图像处理技术交流QQ群 271891601

# !/usr/bin/env python
# -*- coding: utf-8 -*-
# OpenCV的版本为4.4.0

import cv2 as cv
import numpy as np

image = cv.imread('F:/material/images/2022/2022-06/BGR_circle.bmp')

cv.imshow('image', image)

image[:, :, 2] = 0

cv.imshow('image_none_R', image)

cv.waitKey(0)
cv.destroyAllWindows()

运行结果如下:
在这里插入图片描述
通过上面两种方法我们得出重要结论,在对图像矩阵的某类元素进行操作时,首选应该是矩阵运算或者矩阵的切片操作。这两种操作实在搞不定时再考虑通过循环遍历的方法实现。

猜你喜欢

转载自blog.csdn.net/wenhao_ir/article/details/125584942