昊虹君 发表于 2022-11-10 14:38

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

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

如果您想了解OpenCV-C++是如何遍历图像像图的,那么可以参看下面这个页面:
https://www.hhai.cc/thread-110-1-1.html

要想较为熟练地对ndarray对象数据进行遍历、选取等操作,需要有以下基础知识:
01-numpy库ndarray对象的切片操作(三帽号规则)
02-对Numpy库ndarray对象(矩阵)中数据元素的访问、选取操作

目录

[*]01-对二维灰度图像的遍历操作
[*]02-对三通道图像的遍历操作

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
img_col = image_gray.shape

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

cv.imshow('image_gray_reverse', image_gray)

cv.waitKey(0)
cv.destroyAllWindows()
运行结果如下图所示:
http://pic1.hhai.cc/pic1/2022/2022-11/003/41.png

第二种:利用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()
运行结果如下图所示:
http://pic1.hhai.cc/pic1/2022/2022-11/003/42.png

02-对三通道图像的遍历操作
对下面这幅图像进行像素遍历操作:
http://pic1.hhai.cc/pic1/2022/2022-11/003/43.bmp

图像中的三个圆分别为纯红圆、纯绿圆和纯蓝圆。
上面这幅图像百度网盘下载链接:https://pan.baidu.com/s/1pQS7P6EWYqGMMRX_2lx1cw?pwd=1rrs

首先我们看下上面这幅图在ndarray中的存储结构:
http://pic1.hhai.cc/pic1/2022/2022-11/003/44.png

从上面的存储结构可以看出,第一个维度为图像的行数,第二个维度为图像的列数,第三个维度为图像的通道数。
知道上面这个存储结构后,我们才能更有的放矢的进行操作。

现在要把上面这幅图像中的红色圆去掉,该怎么实现呢?
有以下两种方法。

第一种方法:通过循环操作遍历每一个像素的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
img_col = image.shape

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

cv.imshow('image_none_R', image)

cv.waitKey(0)
cv.destroyAllWindows()

运行结果如下图所示:
http://pic1.hhai.cc/pic1/2022/2022-11/003/45.png

第二种方法:用切片操作将红色通道全部置为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()
运行结果如下:
http://pic1.hhai.cc/pic1/2022/2022-11/003/46.png

通过上面两种方法我们得出重要结论:
在对图像矩阵的某类元素进行操作时,首选矩阵运算或者矩阵的切片操作。这两种操作实在搞不定时再考虑通过循环遍历的方法实现。
页: [1]
查看完整版本: Python-OpenCV对图像像素的遍历操作