Python+OpenCV图片局部区域像素值处理详解


Posted in Python onJanuary 23, 2019

背景故事:我需要对一张图片做一些处理,是在图像像素级别上的数值处理,以此来反映图片中特定区域的图像特征,网上查了很多,大多关于opencv的应用教程帖子基本是停留在打开图片,提取像素重新写入图片啊之类的基本操作,我是要取图片中的特定区域再提取它的像素值,作为一个初学者开始接触opencv简直一脸懵,慢慢摸索着知道了opencv的一些函数是可以实现的像SetImageROI()函数设置ROI区域,即感兴趣区域,就很好用啊,总之最后是实现了自己想要的功能。现在看个程序确实是有点挫,也有好多多余的没必要的代码,但毕竟算一次码代码的历程,就原模原样贴在这里吧。

代码功能:在python下用opencv

  • 打开图片并显示并重新写入新的文件
  • 提取图片特定区域的像素值(根据自己需求,下面在代码中注解)
  • 对提取出来的像素值做处理用matplotlib显示成条形图

源码贴在下面:

# -*- coding:utf-8 -*-
__author__ = 'lwp'
import cv2.cv as cv
import numpy as np
import matplotlib.pyplot as plt

# 文件路径
path = '/media/lwp/A/4.bmp'
# 载入一张图片,参数cv.CV_LOAD_IMAGE_GRAYSCALE为打开为灰度图
lwpImg = cv.LoadImage(path, cv.CV_LOAD_IMAGE_GRAYSCALE)
# 创建图像空间,参数为size, depth, channels,这里设置的是图片等高宽30个像素的一个区域,8位,灰度图
box_lwpImg = cv.CreateImage((30, 576), 8, 1)

# 创建窗口
cv.NamedWindow('test1', cv.CV_WINDOW_AUTOSIZE)
cv.NamedWindow("box_test1", cv.CV_WINDOW_AUTOSIZE)

# 设置ROI区域,即感兴趣区域,参数为x, y, width, heigh
cv.SetImageROI(lwpImg, (390, 0, 30, 576)) 
# 提取ROI,从lwpImg图片的感兴趣区域到box_lwpImg
cv.Copy(lwpImg, box_lwpImg)

# 对box区域进行循环提取像素值存到列表pixel_list中
pixel_list = []
for i in range(576): # 576为box的高
  for j in range(30): # 30为box的宽
    x = box_lwpImg[i, j]
    pixel_list.append(x)

# 提取的像素值转为int整型赋给一维数组pixel_list_np_1
pixel_list_np_1 = np.array(pixel_list, dtype=int)
# 转为576*30的二位数组,即按图片box排列
pixel_list_np_2 = np.array(pixel_list_np_1).reshape(576, 30)
# 行求和,得到576个值,即每行的像素信息
pixel_sum = np.sum(pixel_list_np_2, axis=1)

# 取消设置
cv.ResetImageROI(lwpImg)

# 画目标区域
lwpImg = cv.Rectangle(lwpImg, (390, 0), (425, 576), (0, 255, 0), 2)
# 显示图像
cv.ShowImage('test1', lwpImg)
# 查看列表list长度,以确定像素值提取准确
list_length = len(pixel_list)
print list_length

# 查看数组维度,shape验证
print pixel_list_np_1.ndim
print pixel_list_np_1.shape
print pixel_list_np_1

print pixel_list_np_2.ndim
print pixel_list_np_2.shape
print pixel_list_np_2

print pixel_sum

# 画条形图
plt.figure(1)
width = 1
for i in range(len(pixel_sum)):
  plt.figure(1)
  plt.bar(i, pixel_sum[i], width)
plt.xlabel("X")
plt.ylabel("pixel_sum")
plt.show()

# 按ESC退出,按s保存图片
k = cv.WaitKey(0)
if k == 27:         # wait for ESC key to exit
  cv.DestroyAllWindows()
elif k == ord('s'):     # wait for 's' key to save and exit
  cv.WriteFrame('copy_test.png', lwpImg)
  cv.DestroyAllWindows()

补充:这个代码虽然实现了我需要的功能,之后在对视频流做同样像素值提取处理并绘图的时候,意识到图片本就是数组形式,对于8位灰度图,通道数为1,它就是个二位数组,这样就没有必要再设置ROI区域,复制出来这块区域再循环提取像素存入数组进行处理了,可以直接将图片存入数组,再利用numpy进行相应的数组操作就可以了,这样一想就简单很多了,下篇会写对数据流的处理,直接读取视频文件或直接从内存取摄像头的视频流进行处理,未完待续。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python双精度浮点数运算并分行显示操作示例
Jul 21 Python
matplotlib 纵坐标轴显示数据值的实例
May 25 Python
Python基于xlrd模块操作Excel的方法示例
Jun 21 Python
Python在for循环中更改list值的方法【推荐】
Aug 17 Python
解决win64 Python下安装PIL出错问题(图解)
Sep 03 Python
python json.loads兼容单引号数据的方法
Dec 19 Python
Python判断telnet通不通的实例
Jan 26 Python
基于python及pytorch中乘法的使用详解
Dec 27 Python
基于python求两个列表的并集.交集.差集
Feb 10 Python
python简单的三元一次方程求解实例
Apr 02 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
Apr 15 Python
scrapy在python爬虫中搭建出错的解决方法
Nov 22 Python
Python实现查找数组中任意第k大的数字算法示例
Jan 23 #Python
Appium Python自动化测试之环境搭建的步骤
Jan 23 #Python
python读取图片任意范围区域
Jan 23 #Python
Python基于plotly模块实现的画图操作示例
Jan 23 #Python
python实现剪切功能
Jan 23 #Python
对python实现合并两个排序链表的方法详解
Jan 23 #Python
Python基于Logistic回归建模计算某银行在降低贷款拖欠率的数据示例
Jan 23 #Python
You might like
用PHP为SHOPEX增加日志功能代码
2010/07/02 PHP
PHP学习笔记之二
2011/01/17 PHP
php打造智能化的柱状图程序,用于报表等
2015/06/19 PHP
php中session定期自动清理的方法
2015/11/12 PHP
PHP中strcmp()和strcasecmp()函数字符串比较用法分析
2016/01/07 PHP
jquery下onpropertychange事件的绑定方法
2010/08/01 Javascript
JavaScript 高级篇之闭包、模拟类,继承(五)
2012/04/07 Javascript
jquery背景跟随鼠标滑动导航
2015/11/20 Javascript
jQuery 如何给Carousel插件添加新的功能
2016/04/18 Javascript
AngularJS 指令的交互详解及实例代码
2016/09/14 Javascript
vue之数据交互实例代码
2017/06/16 Javascript
jQuery Easyui Treegrid实现显示checkbox功能
2017/08/08 jQuery
nodejs创建简易web服务器与文件读写的实例
2017/09/07 NodeJs
基于Vue2x的图片预览插件的示例代码
2018/05/14 Javascript
jQuery+PHP实现上传裁剪图片
2020/06/29 jQuery
使用jquery模拟a标签的click事件无法实现跳转的解决
2018/12/04 jQuery
vue集成kindeditor富文本的实现示例代码
2019/06/07 Javascript
详解JavaScript匿名函数和闭包
2020/07/10 Javascript
[01:10]DOTA2次级职业联赛 - Fly战队宣传片
2014/12/01 DOTA
python中的函数用法入门教程
2014/09/02 Python
Python实现购物系统(示例讲解)
2017/09/13 Python
解决tensorflow1.x版本加载saver.restore目录报错的问题
2018/07/26 Python
Python一句代码实现找出所有水仙花数的方法
2018/11/13 Python
Python语言快速上手学习方法
2018/12/14 Python
详解python读取image
2019/04/03 Python
纯CSS实现颜色渐变效果(包含环形渐变、线性渐变、彩虹效果等)
2014/05/07 HTML / CSS
Html5中localStorage存储JSON数据并读取JSON数据的实现方法
2017/02/13 HTML / CSS
这段代码难道不该打印出56吗
2013/02/27 面试题
PPP协议组成及简述协议协商的基本过程
2015/05/28 面试题
计算机专业毕业生自荐书
2014/06/02 职场文书
银行奉献演讲稿
2014/09/16 职场文书
医护人员继续教育学习心得体会
2016/01/19 职场文书
高中班主任寄语
2019/06/21 职场文书
Pygame Event事件模块的详细示例
2021/11/17 Python
使用Ajax实现进度条的绘制
2022/04/07 Javascript
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
2022/06/14 Golang