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对象(矩阵)中数据元素的访问、选取操作
目录
第一种方法:用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()
运行结果如下:

对下面这幅图像进行像素遍历操作:

图像中的三个圆分别为纯红圆、纯绿圆和纯蓝圆。
上面这幅图像百度网盘下载链接: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()
运行结果如下:

通过上面两种方法我们得出重要结论,在对图像矩阵的某类元素进行操作时,首选应该是矩阵运算或者矩阵的切片操作。这两种操作实在搞不定时再考虑通过循环遍历的方法实现。
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我有一个rubyonrails应用程序。我按照facebook的说明添加了一个像素。但是,要跟踪转化,Facebook要求您将页面置于达到预期结果时出现的转化中。即,如果我想显示客户已注册,我会将您注册后转到的页面作为成功对象进行跟踪。我的问题是,当客户注册时,在我的应用程序中没有登陆页面。该应用程序将用户带回主页。它在主页上显示了一条消息,所以我想看看是否有一种方法可以跟踪来自Controller操作而不是实际页面的转化。我需要计数的Action没有页面,它们是ControllerAction。是否有任何人都知道的关于如何执行此操作的gem、文档或最佳实践?这是进入布局文件的像素
我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的
本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决