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 参数列表中的self 显式不等于冗余
Dec 01 Python
Python中的元类编程入门指引
Apr 15 Python
python类继承与子类实例初始化用法分析
Apr 17 Python
python使用7z解压apk包的方法
Apr 18 Python
Tensorflow 自带可视化Tensorboard使用方法(附项目代码)
Feb 10 Python
python 将list转成字符串,中间用符号分隔的方法
Oct 23 Python
【python】matplotlib动态显示详解
Apr 11 Python
Python any()函数的使用方法
Oct 28 Python
python tkinter GUI绘制,以及点击更新显示图片代码
Mar 14 Python
pandas to_excel 添加颜色操作
Jul 14 Python
详解Python IO编程
Jul 24 Python
python缺失值的解决方法总结
Jun 09 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语言流程控制中的主动与被动
2012/11/05 PHP
解析mysql 表中的碎片产生原因以及清理
2013/06/22 PHP
PHP header()函数常用方法总结
2014/04/11 PHP
Thinkphp批量更新数据的方法汇总
2016/06/29 PHP
location.href语句与火狐不兼容的问题
2010/07/04 Javascript
jsonp原理及使用
2013/10/28 Javascript
javascript history对象(历史记录)使用方法(实现浏览器前进后退)
2014/01/07 Javascript
js中函数调用的两种常用方法使用介绍
2014/07/17 Javascript
jQuery统计上传文件大小的方法
2015/01/24 Javascript
Bootstrap3.0建站教程(一)之bootstrap表单元素排版
2016/06/01 Javascript
Javascript中常用的检测方法小结
2016/10/08 Javascript
js和jquery中获取非行间样式
2017/05/05 jQuery
Vue项目添加动态浏览器头部title的方法
2018/07/11 Javascript
发布订阅模式在vue中的实际运用实例详解
2019/06/09 Javascript
细说webpack6 Babel的使用详解
2019/09/26 Javascript
JS实现水平移动与垂直移动动画
2019/12/19 Javascript
使用js实现单链解决前端队列问题的方法
2020/02/03 Javascript
[02:42]决战东方!DOTA2亚洲邀请赛重启荣耀之争
2017/03/17 DOTA
[02:55]含熏伴清风,风行者至宝、屠夫身心及典藏宝瓶二展示
2020/09/08 DOTA
用实例详解Python中的Django框架中prefetch_related()函数对数据库查询的优化
2015/04/01 Python
详解Python迭代和迭代器
2016/03/28 Python
Python3中bytes类型转换为str类型
2018/09/27 Python
Python3.4学习笔记之 idle 清屏扩展插件用法分析
2019/03/01 Python
Django框架模板的使用方法示例
2019/05/25 Python
Python OpenCV实现视频分帧
2019/06/01 Python
python 实现交换两个列表元素的位置示例
2019/06/26 Python
Jmeter调用Python脚本实现参数互相传递的实现
2021/01/22 Python
python中openpyxl和xlsxwriter对Excel的操作方法
2021/03/01 Python
详解CSS3选择器:nth-child和:nth-of-type之间的差异
2017/09/18 HTML / CSS
HTML5 canvas基本绘图之绘制曲线
2016/06/27 HTML / CSS
英国办公用品商店:Office Outlet
2018/04/04 全球购物
澳大利亚领先的折扣药房:Chemist Direct(有中文站)
2018/11/24 全球购物
必须要使用游标的SQL语句有那些
2012/05/07 面试题
英文升职感谢信
2015/01/23 职场文书
大学生入党自传2015
2015/06/26 职场文书
html form表单基础入门案例讲解
2021/07/15 HTML / CSS