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的urllib2模块处理url和图片的技巧两则
Feb 18 Python
详解Python的Flask框架中生成SECRET_KEY密钥的方法
Jun 07 Python
利用python的socket发送http(s)请求方法示例
May 07 Python
浅述python2与python3的简单区别
Sep 19 Python
在Mac上删除自己安装的Python方法
Oct 29 Python
django页面跳转问题及注意事项
Jul 18 Python
Numpy数组array和矩阵matrix转换方法
Aug 05 Python
Python学习笔记之lambda表达式用法详解
Aug 08 Python
pytorch 在sequential中使用view来reshape的例子
Aug 20 Python
Django 自动生成api接口文档教程
Nov 19 Python
Python实现平行坐标图的绘制(plotly)方式
Nov 22 Python
PyCharm中配置PySide2的图文教程
Jun 18 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
jQuery 剧场版 你必须知道的javascript
2009/05/27 Javascript
将string解析为json的几种方式小结
2010/11/11 Javascript
js判断游览器类型及版本号的代码
2014/05/11 Javascript
JS常用字符串处理方法应用总结
2014/05/22 Javascript
javascript实现网页屏蔽Backspace事件,输入框不屏蔽
2015/07/21 Javascript
JS刷新父窗口的几种方式小结(推荐)
2016/11/09 Javascript
JS实现的表头列头固定页面功能示例
2017/01/10 Javascript
jQuery实现简单的抽奖游戏
2017/05/05 jQuery
解决React Native端口号修改的方法
2017/07/28 Javascript
vue将时间戳转换成自定义时间格式的方法
2018/03/02 Javascript
教你如何用node连接redis的示例代码
2018/07/12 Javascript
JS实现点击拉拽轮播图pc端移动端适配
2018/09/05 Javascript
nodejs中express入门和基础知识点学习
2018/09/13 NodeJs
Angular刷新当前页面的实现方法
2018/11/21 Javascript
node.js ws模块搭建websocket服务端的方法示例
2019/04/25 Javascript
vue下载excel的实现代码后台用post方法
2019/05/10 Javascript
jQuery与原生JavaScript选择HTML元素集合用法对比分析
2019/11/26 jQuery
js实现滑动进度条效果
2020/08/21 Javascript
[02:54]DOTA2英雄基础教程 撼地者
2014/01/14 DOTA
[15:07]lgd_OG_m2_BP
2019/09/10 DOTA
在Django的URLconf中进行函数导入的方法
2015/07/18 Python
Python实现的朴素贝叶斯算法经典示例【测试可用】
2018/06/13 Python
pandas筛选某列出现编码错误的解决方法
2018/11/07 Python
windows下numpy下载与安装图文教程
2019/04/02 Python
Python使用sax模块解析XML文件示例
2019/04/04 Python
python使用SQLAlchemy操作MySQL
2020/01/02 Python
python 项目目录结构设置
2020/02/14 Python
Python绘图之二维图与三维图详解
2020/08/04 Python
python/golang实现循环链表的示例代码
2020/09/14 Python
使用canvas对多图片拼合并导出图片的方法
2018/08/28 HTML / CSS
美国精品家居用品网站:US-Mattress
2016/08/24 全球购物
酒店服务与管理毕业生求职信
2013/11/02 职场文书
终端业务员岗位职责
2013/11/27 职场文书
高中军训感想800字
2014/02/23 职场文书
乡镇领导干部个人对照检查材料思想汇报
2014/09/23 职场文书
2019年聘任书的写作格式及范文!
2019/07/03 职场文书