图像处理-矩阵变换

article/2025/9/14 14:46:49

Android中通过矩阵来处理图像问题是非常常见的。

颜色矩阵

图像中的每一个像素点都是一个颜色矩阵分量,然后我们让这两个矩阵相乘就能得到一个新的矩阵(新的颜色矩阵分量),这就是矩阵变换对图像中的每一个点的处理,使得对整个图像进行处理。通常我们会用下面整个矩阵作为初始矩阵,因为这个矩阵乘以任何矩阵都是不会改变颜色矩阵分量的。

初始矩阵

我们对颜色矩阵的分析就可以看出来最后一列不会和原有的RGBA中任何一个有关联,所以我们可以称之为颜色偏移量,通过常数来改变颜色。

然后我们怎么在Android中对图像进行处理的呢,我们就需要新建两个方法,其中一个是获得颜色矩阵的值,还有一个是把颜色矩阵对图像进行处理。其实说白了上面那个调节就是自动生成了一个ColorMatrix(可以通过源码看出来,我就不详细说了),然而现在这种是自己输入ColorMatrix,这就是两种的区别了。

private void getMatrix(){for(int i=0;i<20;i++){mColorMatrix[i]=Float.valueOf(mEts[i].getText().toString());}
}private void setImageMatrix(){Bitmap bmp=Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(),Bitmap.Config.ARGB_8888);//一定要新建一个Bitmap,因为传进来的Bitmap是不能修改的,需要重新进行绘制android.graphics.ColorMatrix colorMatrix = new android.graphics.ColorMatrix();colorMatrix.set(mColorMatrix);//将颜色矩阵放入ColorMatrix中去Canvas canvas = new Canvas(bmp);Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);//抗锯齿paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));canvas.drawBitmap(bitmap,0,0,paint);mImageView.setImageBitmap(bmp);
}

下面来个例子:
先编写一个color_matrix.xml的布局文件,有一个ImageView显示图像,然后有一个GridLayout对矩阵进行显示以及修改,然后有三个Button分别对图像进行改变,重置以及选择图片。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><ImageView
        android:id="@+id/imageview"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="2" /><GridLayout
        android:id="@+id/group"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="3"android:columnCount="5"android:rowCount="4"></GridLayout><LinearLayout
        android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><Button
            android:id="@+id/btnChange"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="Change" /><Button
            android:id="@+id/btnReset"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="Reset" /><Button
            android:id="@+id/btnChangeImage"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="ChangeImage" /></LinearLayout></LinearLayout>

然后新建一个ColorMatrix.java文件里面通过我们上述的代码构建出一个ColorMatrix,然后通过这个ColorMatrix重新绘制一个Bitmap显示出来,把上面理解了的话就会好理解好多,Change就是我们根据所调整过后的矩阵对图像进行的处理,Reset就是把矩阵调整成我们上面所说的初始化矩阵,然后在根据这个矩阵对图像进行的处理。其他的就没有什么好说的了,感觉都还蛮容易懂的。

package com.xjh.gin.image;import android.Manifest;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.Paint;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.GridLayout;
import android.widget.ImageView;/*** Created by Gin on 2017/11/26.*/public class ColorMatrix extends BaseActivity implements View.OnClickListener {private static final int PICK_CODE = 0X110;private ImageView mImageView;private GridLayout mGroup;private String mCurreatPhotoStr;private Bitmap bitmap;//就是单独的bitmap,之后的修改不会覆盖这个Bitmapprivate Button btn_Change, btn_Reset, btn_ChangeImage;private int mEtWidth, mEtHeight;private EditText[] mEts = new EditText[20];private float[] mColorMatrix = new float[20];@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.color_matrix);isPermissionAllGranted(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);initView();initEvent();}private void initView() {mImageView = (ImageView) findViewById(R.id.imageview);mGroup = (GridLayout) findViewById(R.id.group);btn_Change = (Button) findViewById(R.id.btnChange);btn_Reset = (Button) findViewById(R.id.btnReset);btn_ChangeImage = (Button) findViewById(R.id.btnChangeImage);}private void initEvent() {btn_Change.setOnClickListener(this);btn_Reset.setOnClickListener(this);btn_ChangeImage.setOnClickListener(this);bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test1);mImageView.setImageBitmap(bitmap);mGroup.post(new Runnable() {//在onCreate方法中因为控件还没有绘制完毕,所以我们无法获得控件的高和宽,所以当控件绘制完毕以后,我们就在线程中获取,因为这时候控件一定绘制完毕了@Overridepublic void run() {mEtWidth = mGroup.getWidth() / 5;mEtHeight = mGroup.getHeight() / 4;addEts();initMatrix();}});}private void addEts() {//添加EditTextfor (int i = 0; i < 20; i++) {EditText editText = new EditText(ColorMatrix.this);mEts[i] = editText;mGroup.addView(editText, mEtWidth, mEtHeight);//让editText动态的加载进mGroup中去}}private void initMatrix() {for (int i = 0; i < 20; i++) {if (i % 6 == 0) {mEts[i].setText(String.valueOf(1));} else {mEts[i].setText(String.valueOf(0));}}}private void getMatrix(){for(int i=0;i<20;i++){mColorMatrix[i]=Float.valueOf(mEts[i].getText().toString());}}private void setImageMatrix(){Bitmap bmp=Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(),Bitmap.Config.ARGB_8888);//一定要新建一个Bitmap,因为传进来的Bitmap是不能修改的,需要重新进行绘制android.graphics.ColorMatrix colorMatrix = new android.graphics.ColorMatrix();colorMatrix.set(mColorMatrix);//将颜色矩阵放入ColorMatrix中去Canvas canvas = new Canvas(bmp);Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);//抗锯齿paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));canvas.drawBitmap(bitmap,0,0,paint);mImageView.setImageBitmap(bmp);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btnChange:getMatrix();setImageMatrix();break;case R.id.btnReset:initMatrix();getMatrix();setImageMatrix();break;case R.id.btnChangeImage:Intent intent = new Intent(Intent.ACTION_PICK);intent.setType("image/*");startActivityForResult(intent, PICK_CODE);break;}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if (requestCode == PICK_CODE) {if (data != null) {Uri uri = data.getData();Cursor cursor = getContentResolver().query(uri, null, null, null, null);cursor.moveToFirst();int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);mCurreatPhotoStr = cursor.getString(idx);cursor.close();resizePhoto();}}super.onActivityResult(requestCode, resultCode, data);}private void resizePhoto() {BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;//true为不加载图片,只有宽高这类的数据BitmapFactory.decodeFile(mCurreatPhotoStr, options);double ratio = Math.max(options.outWidth * 1.0d / 1024f, options.outHeight * 1.0d / 1024f);//求出压缩比例options.inSampleSize = (int) Math.ceil(ratio);//把压缩比例传入options中options.inJustDecodeBounds = false;bitmap = BitmapFactory.decodeFile(mCurreatPhotoStr, options);mImageView.setImageBitmap(bitmap);//压缩图片,mPhoto是压缩过后的Bitmap}
}

ColorMatrix

然后我们就可以发现图像处理其实就是研究不同的颜色矩阵对图像的处理效果

项目GitHub地址:传送门


http://chatgpt.dhexx.cn/article/xHdLCXbd.shtml

相关文章

shader中的常用矩阵变换

unity shader 矩阵学习 矩阵运算法则&#xff08;1&#xff09;矩阵和标量的乘法&#xff08;2&#xff09;矩阵和矩阵的乘法矩阵相乘的条件 和 结果的行数和列数 变换的基本概念(1)变换(2)线性变换(3)平移变换(4)仿射变换&#xff08;5&#xff09;齐次坐标 2D 矩阵变换&#…

【Matlab】矩阵变换与矩阵求值

矩阵变换与矩阵求值 对角矩阵&#xff1a;只有对角线上有非零元素的矩阵。 数量矩阵&#xff1a;对角线上的元素相等的对角矩阵。 单位矩阵&#xff1a;对角线上的元素都为1的对角矩阵。 diag函数 提取矩阵的对角线元素 diag(A)&#xff1a;提取矩阵A主对角线元素&#x…

闫令琪图形学入门笔记(矩阵变换篇)

整个坐标变化过程贯穿管线渲染&#xff0c;它与光栅化、着色一同构成GPU完整的渲染过程。所以理解三维世界的坐标与矩阵变换是首要的学习内容 1.1 向量的点乘与叉乘 点乘 向量的点乘可以求得一个数&#xff0c;利用点乘可以进一步计算两向量的夹角大小&#xff0c;或者一个…

点云矩阵变换

点云矩阵变换 变换矩阵工作原理 : |-------> 变换矩阵列| 1 0 0 x | \| 0 1 0 y | }-> 左边是一个3阶的单位阵(无旋转)| 0 0 1 z | /| 0 0 0 1 | -> 这一行用不到 (这一行保持 0,0,0,1)要进行点云旋转&#xff0c;需要对3阶矩阵进行赋值 如何赋值参考&#xf…

OpenGL矩阵变换

参考内容&#xff1a; 1. 这次&#xff0c;彻底搞懂 OpenGL 矩阵转换 2. Article - World, View and Projection Transformation Matrices 模型变换的基本流程图&#xff1a; 1. 模型变换 模型变换解决的是&#xff0c;把物体在世界坐标系下的位置拆分成平移、缩放、旋转的…

MATLAB矩阵变换

目录 对角阵与三角阵 1、对角阵 &#xff08;1&#xff09;提取矩阵的对角线元素 (2)构造对角阵 2、三角阵 (1)上三角阵 (2)下三角阵 矩阵的转置与旋转 1、矩阵的转置 2、矩阵的旋转 3、矩阵的左右翻转 4、矩阵的上下翻转 矩阵的逆与伪逆 1、矩阵的逆 2、矩阵的伪…

Cesium 矩阵变换

在Cesium和其他三维开发中中经常用到矩阵变换。比如将一个物体移动、缩放、平移都可以用变换矩阵来计算。 再比如将三维场景中的物体转换为屏幕上显示的二维图形&#xff0c;需要用到透视投影&#xff08;perspective projection&#xff09;矩阵。 变换&#xff08;tansform…

浅谈矩阵变换——Matrix

矩阵变换在图形学上经常用到。基本的常用矩阵变换操作包括平移、缩放、旋转、斜切。 每种变换都对应一个变换矩阵&#xff0c;通过矩阵乘法&#xff0c;可以把多个变换矩阵相乘得到复合变换矩阵。 矩阵乘法不支持交换律&#xff0c;因此不同的变换顺序得到的变换矩阵也是不相同…

变换矩阵

1、变换矩阵 变换矩阵可以分解为缩放&#xff0c;旋转&#xff0c;平移矩阵的乘积&#xff1a; M T * R * S - 右手坐标系 当均匀缩放时&#xff0c;旋转和缩放可以交换顺序 缩放和平移不可以交换顺序 2、子坐标系与父坐标系 由在父坐标系中的坐标位置P&#xff0c;和三…

矩阵基础与变换

矩阵基础 矩阵的基本概念 由 m n 个数aij排成的m行n列的数表称为m行n列的矩阵&#xff0c;简称m n矩阵&#xff08;引用百度百科&#xff09;。记作&#xff1a; 这mn 个数称为矩阵A的元素&#xff0c;简称为元&#xff0c;数aij位于矩阵A的第i行第j列。 矩阵的加法 同型…

2.2 矩阵变换

写在前面&#xff1a;作者本人是纯纯的菜鸟&#xff0c;学习的内容来自于 中国大学MOOC 中南大学 《科学计算与MATLAB语言》&#xff0c;欢迎各位大佬或新手在这里和平讨论&#xff0c;如果我有错误请各位不吝赐教&#xff0c;提前感谢各位捧场&#xff01; 何为矩阵变化&#…

线性代数学习笔记——第七十二讲——共轭矩阵

1. 本讲内容概要 2. 复数及其性质及复数的运算 3. 复共轭及模 4. 共轭矩阵的定义及性质

共轭矩阵 正定矩阵

https://blog.csdn.net/know9163/article/details/80551764

共轭 、 共轭转置、共轭矩阵、酉矩阵、正定矩阵、半正定矩阵

共轭复数 实数部分相同而虚数部分互为相反数的两个复数。 矩阵的共轭转置 把矩阵转置后&#xff0c;再把每一个数换成它的共轭复数。 自共轭矩阵 矩阵中每一个第i 行第j 列的元素都与第j 行第i 列的元素的共轭相等。 酉矩阵 AH 是A 的共轭转置 A叫做酉矩阵 正定矩阵 半正…

matlab-线性代数 对矩阵取共轭(不用函数)

由上图所示&#xff0c;可以得知&#xff1a;a是求矩阵的共轭转置&#xff0c;而a.是求矩阵的共轭。在数学中&#xff0c;共轭转置表示为在矩阵的右上角加上H。 如果矩阵是实数矩阵&#xff0c;那么a和a.的结果一样&#xff0c;都是求矩阵的转置&#xff0c;如下图所示&#xf…

我的矩阵学习

摘自矩阵&#xff08;数学术语&#xff09;_百度百科 定义 由 m n 个数aij排成的m行n列的数表称为m行n列的矩阵&#xff0c;简称m n矩阵。记作&#xff1a; 这mn 个数称为矩阵A的元素&#xff0c;简称为元&#xff0c;数aij位于矩阵A的第i行第j列&#xff0c;称为矩阵A的(i…

矩阵的共轭

The conjugate of a matrix&#xff08;矩阵的共轭&#xff09;&#xff1a;矩阵元素中有复数&#xff08;complex number&#xff09;&#xff0c;将矩阵中的复数求共轭&#xff0c;实数不变。矩阵的共轭记为。如&#xff1a;

旋转矩阵,矩阵,共轭矩阵

旋转矩阵&#xff0c;矩阵&#xff0c;共轭矩阵 1.旋转矩阵1. 旋转矩阵简介2. 性质3. 二维空间3.1 普通旋转3.2 复平面 4. 三维空间4.1 旋转4.2 角-轴表示和四元数表示4.3 欧拉角表示4.4 对称保持 SVD 表示 5 .其他5.1 旋转轴5.2 叉乘计算 2 矩阵2.1 定义2.2 矩阵的基本运算2.3…

矩阵的迹\矩阵的秩\伴随矩阵\共轭矩阵,基底、维数与秩,相对某个基底的坐标计算方法

矩阵的迹&#xff08;Trace&#xff09; n n n\times n nn的方阵A的n个对角线元素的和称为方阵A的迹&#xff0c;记作tr(A). A ( a 11 ⋯ a 1 n ⋮ ⋮ a n 1 ⋯ a n n ) A\begin{pmatrix}a_{11}&\cdots &a_{1n}\\\vdots&\ &\vdots\\a_{n1}&\cdots&a_…

共轭复数,共轭根式,共轭矩阵,共轭方向,共轭方向法,共轭梯度法,共轭分布,共轭函数,傅里叶变换的共轭对称

目录 1. 共轭复数 2. 傅里叶变换的共轭对称性 3. 共轭根式(radical conjugates) 4. 共轭矩阵&#xff08;自共轭矩阵、Hermitian&#xff08;埃尔米特&#xff09;矩阵&#xff09; 5. 共轭方向 6. 共轭方向法 7. 共轭梯度法 8. 共轭分布(conjugacy) 9. 共轭函数&…