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 相关文章推荐
写了个监控nginx进程的Python脚本
May 10 Python
跟老齐学Python之开始真正编程
Sep 12 Python
python操作xlsx文件的包openpyxl实例
May 03 Python
Python实现自定义函数的5种常见形式分析
Jun 16 Python
Django框架之DRF 基于mixins来封装的视图详解
Jul 23 Python
Django项目主urls导入应用中views的红线问题解决
Aug 10 Python
python模拟预测一下新型冠状病毒肺炎的数据
Feb 01 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
Mar 06 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
Apr 07 Python
解决python中0x80072ee2错误的方法
Jul 19 Python
next在python中返回迭代器的实例方法
Dec 15 Python
Python 文字识别
May 11 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自动生成印有用户信息的名片
2016/08/01 PHP
PHP基于GD库的图像处理方法小结
2016/09/27 PHP
phpstudy默认不支持64位php的解决方法
2017/02/20 PHP
PHP5.6.8连接SQL Server 2008 R2数据库常用技巧分析总结
2019/05/06 PHP
不错的asp中显示新闻的功能
2006/10/13 Javascript
js利用div背景,做一个竖线的效果。
2008/11/22 Javascript
javascript Ext JS 状态默认存储时间
2009/02/15 Javascript
Jquery 基础学习笔记
2009/05/29 Javascript
始终在屏幕中间显示Div的代码(css+js)
2011/03/10 Javascript
js获取下拉列表框中的value和text的值示例代码
2014/01/11 Javascript
javascript数组详解
2014/10/22 Javascript
Vue之Vue.set动态新增对象属性方法
2018/02/23 Javascript
vue.js打包之后可能会遇到的坑!
2018/06/03 Javascript
详解Vue微信授权登录前后端分离较为优雅的解决方案
2018/06/29 Javascript
JavaScript作用域链实例详解
2019/01/21 Javascript
ES6中异步对象Promise用法详解
2019/07/31 Javascript
Layer.js实现表格溢出内容省略号显示,悬停显示全部的方法
2019/09/16 Javascript
用Python编写脚本使IE实现代理上网的教程
2015/04/23 Python
在Django中同时使用多个配置文件的方法
2015/07/22 Python
python实现人人自动回复、抢沙发功能
2018/06/08 Python
python实现推箱子游戏
2020/03/25 Python
Python设计模式之策略模式实例详解
2019/01/21 Python
python批量识别图片指定区域文字内容
2019/04/30 Python
Python selenium页面加载慢超时的解决方案
2020/03/18 Python
Keras之自定义损失(loss)函数用法说明
2020/06/10 Python
CSS3实现银灰色动画效果的导航菜单代码
2015/09/01 HTML / CSS
Linux面试经常问的文件系统操作命令
2015/11/05 面试题
热能动力工程毕业生自荐信
2013/11/07 职场文书
致1500米运动员广播稿
2014/02/07 职场文书
实用的简历自我评价
2014/03/06 职场文书
《圆的面积》教学反思
2016/02/19 职场文书
《我的长生果》教学反思
2016/02/20 职场文书
导游词之山东八大关
2019/12/18 职场文书
Python OpenCV快速入门教程
2021/04/17 Python
Python爬虫之爬取某文库文档数据
2021/04/21 Python
vue封装数字翻牌器
2022/04/20 Vue.js