昊虹AI笔记网

 找回密码
 立即注册
搜索
查看: 575|回复: 0
收起左侧

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

[复制链接]

238

主题

241

帖子

931

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
931
昊虹君 发表于 2022-11-10 14:38 | 显示全部楼层 |阅读模式
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
[Python] 纯文本查看 复制代码
# -*- 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库中各种矩阵基本运算(加、减、乘、点乘、点除、乘方、转置等)
示例代码如下:
[Python] 纯文本查看 复制代码
# -*- 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实现。
代码如下:
[Python] 纯文本查看 复制代码
# -*- 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(一句代码搞定)
[Python] 纯文本查看 复制代码
# -*- 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()

运行结果如下:


通过上面两种方法我们得出重要结论:
在对图像矩阵的某类元素进行操作时,首选矩阵运算或者矩阵的切片操作。这两种操作实在搞不定时再考虑通过循环遍历的方法实现。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|昊虹AI笔记网 ( 蜀ICP备2024076726 )

GMT+8, 2024-5-19 15:03 , Processed in 0.026335 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表