Android和OpenCV的学习mat运算/颜色转换
目录
1 Mat
1.1 Mat的概念
1.2 Bitmap和Mat的转换
1.3 Mat的位运算和算术运算
1.4 Mat的release
2 颜色转换
2.1 图像色彩模式
2.2 cvtColor()颜色转换函数
2.3 threshold()阈值函数
1 Mat
1.1 Mat的概念
Mat类主要用来定义Mat对象,切割Mat对象。常规的Bitmap位图在OpenCV中都需要转换为Mat,。
Android中对图像是用bitmap格式来进行处理,而openCV中是采用Mat格式进行处理。所以我们在Android中使用OpenCV也要将Bitmp转化为Mlat格式。Mat类用于表示一个多维的单通道或者多通道的数组。能够用来保存实数或复数的向量、矩阵,灰度或彩色图像,立体元素,张量以及直方图。简而言之,Mat就是用来保存多维的矩阵的。Mat对象中包含了图像的各种基本信息与图像像素数据。Mat是由头部与数据部分组成的,其中头部还包含一个指向数据的指针。我们把Mat可以视作就是图像矩阵。
1.2 Bitmap和Mat的转换
Bitmat转Mat
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.f001);//图片名称
Mat mat = new Mat();
Utils.bitmapToMat(bitmap, mat);
直接用mat加载图片
try {
mat1 = Utils.loadResource(this, R.drawable.f001);//图片名称
} catch (IOException e) {
e.printStackTrace();
}
Mat转Bitmat在Android UI上显示
bitmap = Bitmap.createBitmap(mat.width(), mat.height(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(mat, bitmap);
imageView.setImageBitmap(bitmap);
1.3 Mat的位运算和算术运算
Core类主要用于Mat的运算,提供了很多运算功能的静态函数。
Mat格式的图像可以直接进行位运算和算术运算。位运算主要支持按位非、按位与、按位或、按位异或。算术运算主要支持加减乘除。这些运算其实实际上都是矩阵的运算。
方法 | 操作 |
public static void bitwise_not ( Mat mat,Mat dst) | 按位非 |
public static void bitwise_and (Mat mat, Mat mat1, Mat dst) | 按位与 |
public static void bitwise_or(Mat mat,Mat mat1,Mat dst) | 按位或 |
public static void bitwise_xor(Mat mat, Mat mat1, Mat dst) |
按位异或 |
方法 | 操作 |
public static void add(Mat mat, Mat mat1, Mat dst) | 矩阵加法 |
public static void subtract(Mat mat, Mat mat1, Mat dst) | 矩阵减法 |
public static void multiply(Mat mat, Mat mat1, Mat dst) | 矩阵乘法 |
public static void divide(Mat mat, Mat mat1, Mat dst,double scale,int dtype) | 矩阵除法 |
使用例子
//按位和 两张图片宽高一样
Core.bitwise_and(mat1,mat2,dst);
bitmap =Bitmap.createBitmap(dst.width(),dst.height(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(dst,bitmap);
img1.setImageBitmap(bitmap);
1.4 Mat的release
protected void onDestroy(){
super. onDestroy();
mat.release();
}
2 颜色转换
2.1 图像色彩模式
图像的色彩模式主要有以下几种:
位图模式 位图模式是图像中最基本的格式,图像只有黑色和白色像素,是色彩模式中占有空间最小的,同样也叫做黑白图,它包含的信息量最少,无法包含图像中的细节,相当于只有0或者1。一副彩色图如果要转换成黑白模式,则一般不能直接转换,需要首先将图像转换成灰度模式。
灰度模式 灰度模式即使用单一色调来表示图像,与位图模式不同,不像位图只有0和1,使用256级的灰度来表示图像,一个像素相当于占用8位一个字节,每个像素值使用0到255的亮度值代表,其中0为黑色,255为白色,相当于从黑->灰->白的过度,通常我们所说的黑白照片就是这种模式,与位图模式相比,能表现出一定的细节,占用空间也比位图模式较大。
RGB模式 RGB模式为我们经常见到的,被称为真色彩。RGB模式的图像有3个颜色通道,分布为红(Red) ,绿(Green)和蓝(Bule),每个都占用8位一个字节来表示颜色信息,这样每个颜色的取值范围为O~255,那么就三种颜色就可以有多种组合,当三种基色的值相等时表现出为灰色,三种颜色都为255即为白色,三种颜色都为O,即为黑色。RGB模式的图像占用空间要比位图,灰度图都要大,但表现出的细节更加明显。
HSV模式 是根据日常生活中人眼的视觉对色彩的观察得而制定的一套色彩模式,最接近与人类对色彩的辨认的思考方式,所有的颜色都是用色彩三属性来描述
- H:(色相):是指从物体反射或透过物体传播的颜色
- S:(饱和度):是指颜色的强度或纯度,表示色相中灰色成分所占的比例
- V:(亮度):是指颜色的相对明暗程度,通常100%定义为白色;0%为黑色
- 另外还有CMYK模式、YUV模式等。
2.2 cvtColor()颜色转换函数
OpenCv中主要使用cvtColor()函数进行颜色转换操作。
Imgproc.cvtColor(source mat,destination mat1,Color_Conversion_Code);
Color_Conversion_Code:颜色转换模式
常用的颜色转换模式
颜色码 | 功能 |
COLOR_BGR2RGB | 颜色空间转换 |
COLOR_BGR2GRAY | BGR转换到灰度空间 |
COLOR_GRAY2RGB | 灰度转换到RGB |
COLOR_RGB2HSV | RGB转换到HSV |
COLOR_RGB2RGBA |
添加alpha通道 |
灰度转换例子
Bitmap bp= BitmapFactory.decodeResource(getResources(),R.drawable.f001);//图片名字
Utils.bitmapToMat(bp,mat1);
Imgproc.cvtColor(mat1,mat2,Imgproc.COLOR_BGRA2GRAY);
Utils.matToBitmap(mat2,bp);
img1.setImageBitmap(bp);
2.3 threshold()阈值函数
图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。转换二值图的关键就是确定一个阈值,整张图片中高于阈值的点都置为255,低于阈值的点都置为0,就可以呈现出明显的二值黑白效果。阈值的确定有两种方法,一种是手动指定,由开发者手动确定一个阈值,在一些专用场景下可以通过实验效果调整。手动阀值法手动阈值法所使用的函数的是: Imgproc.threshold ()。另一种自动阈值法,OpenCV中也可以使用算法来自动计算阈值。OpenCV支持均值算法和高斯均值算法。它不是计算全局图像的阈值,而是根据图像不同区域亮度分布,计算其局部阈值,所以对于图像不同区域,能够自适应计算不同的阈值,因此被称为自适应阈值法。使用的函数的是:Imgproc.adaptiveThreshold()
手动阈值
threshold(Mat mat,Mat dst,double thresh,double maxval, int type);
参数:
- mat:Mat 输入图像
- dst:Mat 输入图像 阈值操作结果填充在此图像
- thres:double 自己指定的阈值
- maxval:double 当type为THRESH_BINARY 或 THRESH_BINARY_INV时的最大值
- type:int,阈值类型,对对象取阈值的方式0:THRESH_BINARY : src(x,y) > thresh ? maxval : 0。当前像素点的灰度值>当前像素点值为maxval,反之为0。
- THRESH_BINARY_INV : src(x,y) > thresh ? 0 : maxval。当前像素点灰度值 > thresh,当前像素点值为О反之为 maxval。
- THRESH_TRUNC : src(x,y) > thresh ? threshold : src(x,y)。当前像素点灰度值 > thresh,设定为thvesh,反之保持不变。
- THRESH_ TOZERO :src(x,y) > thresh ? src(x,y):0。当前像素点灰度值>thresh,当前像素点值保持不变,其他情况为0。
- THRESH_TOZERO_INV : src(x,y) > thresh ? 0 : src(x,y)。当前像素点灰度值>thresh,当前像素点值为0,其他情况保持不变。
Imgproc.threshold(mat,dst,125,255,Imgproc.THRESH_BINARY);
自动阈值
public static adaptiveThreshold(Nat src,Hat dst ,double maxNalue,int adaptivetMethod,int thresholdType,int blockSize,double C)
参数:
- src : Mat输入图像
- dst : Mat输出图像阈值操作结果填充在此图像
- maxValue : double 分配给满足条件的像素的非零值
- adaptiveMethod : int自定义使用的阈值算法,ADAPTIVE_THRESH_MEAN_C、ADAPTIVE_THRESH_GAUSSIAN_C --ADAPTIVE_THRESH_MEAN_C时,T(x,y) = blockSize * blockSize [b] blockSize [b]=邻域内(x,y)- C --ADAPTIVE_THRESH_GAUSSIAN_C时,T(x,y) = blockSize * blockSize [b] blockSize [b]=邻域内(x,y)-C与高斯窗交叉相关的加权总和
- thresholdType : int阈值类型,只能是THRESH_BINARY、THRESH_BINARY_INV
- blockSize : int 用来计算阈值的邻域尺寸3,5,7等等,奇数
- C : double 减去平均值或加权平均值的常数,通常情况下,它是正的,但也可能是零或负。
Imgproc.adaptiveThreshold(mat,dst ,255,Imgproc.ADAPTIVE_THRESH_MEAN_C,Imgproc.THRESH_BINARY,13,5);
Android和OpenCV的学习mat运算/颜色转换相关推荐
- Dlib学习笔记:解决dlib array2d转 OpenCV Mat时颜色失真
Dlib学习笔记:解决dlib array2d转 OpenCV Mat时颜色失真 [尊重原创,转载请注明出处] http://blog.csdn.net/guyuealian/article/deta ...
- 【从零学习OpenCV 4】Mat类介绍
本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门 ...
- opencv进阶学习笔记3:像素运算和图像亮度对比度调节
基础版传送门: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版目录: python+opencv进阶版学习笔记目录(适合有一定基础) 像素运算 要求两张图大小,以及格式(np ...
- 学习笔记—android实现opencv人脸检测
1.导入opencv库 在Android studio导入OpenCV配置使用中有详细说明 2.添加文件 Manifest 的设置权限,主要是对摄像头添加权限 <?xml version=&qu ...
- OpenCV 图像处理学习手册:1~5
原文:Learning Image Processing with OpenCV 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 计算机视觉 译文集],采用译后编辑(MT ...
- 超详细!使用OpenCV深度学习模块在图像分类下的应用实践
专注计算机视觉前沿资讯和技术干货 微信公众号:极市平台 官网:https://www.cvmart.net/ 极市导读:本文来自6月份出版的新书<OpenCV深度学习应用与性能优化实践>, ...
- Opencv C++ 学习视频整理源代码(1)
0.代码基本框架 #include <opencv2/opencv.hpp> #include <opencv2/tracking.hpp> #include <iost ...
- 独家|OpenCV 1.1 Mat - 基本图像容器(附链接)
翻译:陈之炎 校对:吴振东.林夕本文约3600字,建议阅读10分钟本文为大家系统地介绍了OpenCV官方教程. 写在前边 让读者朋友们较为系统地了解和学习OpenCV官方教程,数据派THU翻译组联合研 ...
- 基于python的opencv的学习
前言 在了解基本的python语法后,我们终于可以开始进行一些项目的实践学习.这里 用opencv进行第一个python项目的上手. 这里我将会分享自己寒假对于opencv的学习 一.安装开发环境 推 ...
最新文章
- ATMEGA328实验电路板
- 如何打印CloudFoundry上应用运行时的环境变量
- Visual Studio “15”的第四个预览版发布
- Java学习日报—Swagger介绍 与 布隆过滤器详解—2021/12/01
- 面向对象设计模式纵横谈:Prototype 原型模式(笔记记录)
- HashMap遍历方式
- AK的故事之英语学习篇(mistake)
- 照片打印软件 mac_如何在Mac上轻松打印照片
- SQLyog 激活 注册码
- python移动文件但不覆盖_怎么做到Python file重复写入之前的内容不被后写入的覆盖...
- 新计算机分区,新电脑如何分区 新电脑怎么分盘
- 有哪些好的3D建模软件,最近对3D建模很感兴趣?
- 国家自然科学基金重点项目启动暨软件定义网络 技术前瞻研讨会
- Nose | 超轻的单元测试框架-精通
- 什么是Web3?为什么说通往Web3的是区块链?
- 韦东山Linux视频第1期
- ffmpeg播放器声音效果1-淡入淡出
- LAMP环境搭建步骤
- php 科试题,科学网—《数据库系统原理与技术》试题库试题与参考答案选编6 - 程学先的博文...
- 3.10 docker---概念介绍,安装和初识docker,docker的一些基本命令,使用docker部署一个nginx,
热门文章
- ImportError: cannot import name ‘get_all_providers‘ from ‘onnxruntime.capi._pybind_state‘
- 07深圳浩项隔音窗,隔音知识与方法
- PLC协议宏通信功能介绍
- Spark中Map和Json字符串相互转换
- 专项审计有哪些?专项审计报告包含哪些内容?
- Seata 新特性,APM 支持 SkyWalking,java区块链开发教程pdf
- MapReduce论文笔记
- 『为金融数据打标签』「2. 元标签方法」
- HTML笔记及案例(全)
- 哲理故事与管理之道(11)-让自己成为领袖和榜样