Python-OpenCV对图像像素的遍历操作示例
如果您想了解OpenCV-C++是如何遍历图像像图的,那么可以参看下面这个页面:
https://www.hhai.cc/thread-110-1-1.html
Python-OpenCV以Numpy库的中ndarray对象存储图像数据,所以在Python-OpenCV中对图像的遍历就是对ndarray对象的遍历。
要想较为熟练地对ndarray对象数据进行遍历、选取等操作,需要有以下基础知识:
01-numpy库ndarray对象的切片操作(三帽号规则)
02-对Numpy库ndarray对象(矩阵)中数据元素的访问、选取操作
01-对二维灰度图像的遍历操作
第一种方法:用for循环操作遍历每一个像素,然后对像素值进行操作
示例代码如下:
代码中用到的图像下载链接:https://pan.baidu.com/s/1SPxGouOli-XbBYfr-IJ9nw?pwd=dwch
# -*- coding: utf-8 -*-
# 出处:昊虹AI笔记网(hhai.cc)
# 用心记录计算机视觉和AI技术
# 博主微信/QQ 2487872782
# QQ群 271891601
# 欢迎技术交流与咨询
# OpenCV的版本为4.4.0
import cv2 as cv
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库中各种矩阵基本运算(加、减、乘、点乘、点除、乘方、转置等)
示例代码如下:
# -*- coding: utf-8 -*-
# 出处:昊虹AI笔记网(hhai.cc)
# 用心记录计算机视觉和AI技术
# 博主微信/QQ 2487872782
# QQ群 271891601
# 欢迎技术交流与咨询
# OpenCV的版本为4.4.0
import cv2 as cv
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实现。
代码如下:
# -*- coding: utf-8 -*-
# 出处:昊虹AI笔记网(hhai.cc)
# 用心记录计算机视觉和AI技术
# 博主微信/QQ 2487872782
# QQ群 271891601
# 欢迎技术交流与咨询
# OpenCV的版本为4.4.0
import cv2 as cv
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(一句代码搞定)
# -*- coding: utf-8 -*-
# 出处:昊虹AI笔记网(hhai.cc)
# 用心记录计算机视觉和AI技术
# 博主微信/QQ 2487872782
# QQ群 271891601
# 欢迎技术交流与咨询
# OpenCV的版本为4.4.0
import cv2 as cv
image = cv.imread('F:/material/images/2022/2022-06/BGR_circle.bmp')
cv.imshow('image', image)
image[:, :, 2] = 0 # 这句话将红色通道的灰度值全部置为0
cv.imshow('image_none_R', image)
cv.waitKey(0)
cv.destroyAllWindows()
运行结果如下:
通过上面两种方法我们得出重要结论,在对图像矩阵的某类元素进行操作时,首选应该是矩阵运算或者矩阵的切片操作。这两种操作实在搞不定时再考虑通过循环遍历的方法实现。