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 相关文章推荐
pyspark 读取csv文件创建DataFrame的两种方法
Jun 07 Python
使用python读取csv文件快速插入数据库的实例
Jun 21 Python
python实现将文件夹下面的不是以py文件结尾的文件都过滤掉的方法
Oct 21 Python
Python SMTP发送邮件遇到的一些问题及解决办法
Oct 24 Python
在linux系统下安装python librtmp包的实现方法
Jul 22 Python
浅谈Python2之汉字编码为unicode的问题(即类似\xc3\xa4)
Aug 12 Python
python中sort和sorted排序的实例方法
Aug 26 Python
python关于调用函数外的变量实例
Dec 26 Python
Pytorch 多块GPU的使用详解
Dec 31 Python
解决tensorflow打印tensor有省略号的问题
Feb 04 Python
python绕过图片滑动验证码实现爬取PTA所有题目功能 附源码
Jan 06 Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Apr 12 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判断字符以及字符串的包含方法属性
2008/08/30 PHP
PHP JSON 数据解析代码
2010/05/26 PHP
php适配器模式介绍
2012/08/14 PHP
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
2014/04/10 PHP
php编程中echo用逗号和用点号连接的区别
2016/03/26 PHP
PHP命名空间和自动加载类
2016/04/03 PHP
javascript 多级checkbox选择效果
2009/08/20 Javascript
js 通用javascript函数库整理
2011/08/14 Javascript
jquery实现将获取的颜色值转换为十六进制形式的方法
2014/12/20 Javascript
JS模拟并美化的表单控件完整实例
2015/08/19 Javascript
使用 stylelint检查CSS_StyleLint
2016/04/28 Javascript
微信和qq时间格式模板实例详解
2016/10/21 Javascript
vue父组件向子组件(props)传递数据的方法
2018/01/02 Javascript
JavaScript实现读取与输出XML文件数据的方法示例
2018/06/05 Javascript
bootstrap treeview 树形菜单带复选框及级联选择功能
2018/06/08 Javascript
jquery实现搜索框功能实例详解
2018/07/23 jQuery
详解express使用vue-router的history踩坑
2019/06/05 Javascript
Vue.js组件props数据验证实现详解
2019/10/19 Javascript
Element-UI 使用el-row 分栏布局的教程
2020/10/26 Javascript
python下MySQLdb用法实例分析
2015/06/08 Python
用yum安装MySQLdb模块的步骤方法
2016/12/15 Python
win10下Python3.6安装、配置以及pip安装包教程
2017/10/01 Python
Request的中断和ErrorHandler实例解析
2018/02/12 Python
一文了解Python并发编程的工程实现方法
2019/05/31 Python
Python导入模块包原理及相关注意事项
2020/03/25 Python
如何在django中运行scrapy框架
2020/04/22 Python
python中format函数如何使用
2020/06/22 Python
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
Ted Baker英国官网:男士和女士服装及配件
2017/03/13 全球购物
澳大利亚首个在线预订旅游网站:Wotif
2017/07/19 全球购物
国际经济贸易专业推荐信
2013/11/06 职场文书
机房搬迁方案
2014/05/01 职场文书
应届生求职信范文
2014/06/30 职场文书
乡镇消防安全责任书
2014/07/23 职场文书
音乐教师个人工作总结
2015/02/06 职场文书
mysql拆分字符串作为查询条件的示例代码
2022/07/07 MySQL