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

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()

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值