包含整数的二维矩阵 M 表示一个图片的灰度。你需要设计一个平滑器来让每一个单元的灰度成为平均灰度 (向下舍入) ,平均灰度的计算是周围的8个单元和它本身的值求平均,如果周围的单元格不足八个,则尽可能多的利用它们。

输入:
[[1,1,1],[1,0,1],[1,1,1]]
输出:
[[0, 0, 0],[0, 0, 0],[0, 0, 0]]

看到这个题目一开始没啥思路,只有暴力的想法。后来看到别人的思路发现非常神奇,涨姿势了。

首先可以用到的就是方向向量法。把需要操作的格子做成一个方向向量表,遍历向量表操作,同时加上筛选条件,选取需要的格子。代码如下:

class Solution {public int[][] imageSmoother(int[][] M) {//方向向量法int r = M.length;int c = M[0].length;int[][] dir = {{-1,-1},{-1,0},{-1,1},{0,-1},{0,0},{0,1},{1,-1},{1,0},{1,1}};int[][] res = new int[r][c];for(int i = 0; i< r; i++)for(int j = 0; j< c; j++){int sum = 0;int count = 0;for(int[] d : dir){int x = i +d[0];int y = j +d[1];if(x < 0 || x >= r || y < 0 || y >= c) continue;sum += M[x][y];count++;}res[i][j] = sum/count;}return res;}
}

看到大家的讨论,还有一种比较简单的方式,那就是小区域法。

最终我需要求和的只是一片矩阵小区域,所以可以把小区域的边界找出来。然后再遍历小区域里面的所有格子。代码如下。

class Solution {public int[][] imageSmoother(int[][] M) {//小区域法int r = M.length;int c = M[0].length;int[][] res = new int[r][c];for(int i = 0; i< r; i++)for(int j = 0; j< c; j++){int pu = i-1 < 0 ? i : i-1;int pd = i+1 >=r ? i : i+1;int pl = j-1 < 0 ? j : j-1;int pr = j+1 >=c ? j : j+1;int sum = 0;for(int x = pu ; x<= pd; x++)for(int y = pl; y<= pr; y++ )sum += M[x][y];res[i][j] = sum/((pd-pu+1)*(pr-pl+1));}return res;}
}

不过,总的来说,方向向量会更灵活一点,哪些格子可以任意选取,不一定要矩形。

矩阵操作之:方向向量法相关推荐

  1. 矩阵 计算机应用,《计算机视觉算法:基于OpenCV的计算机应用开发》 —3.3 元素级矩阵操作...

    3.3 元素级矩阵操作 基于元素的(元素级)矩阵操作是计算机视觉中的一类数学函数和算法,它处理矩阵的各个元素,或者说,图像中的每个像素.注意基于元素的操作可以并行化,因此矩阵元素的处理顺序不重要.这个 ...

  2. 数字化方法基础(四)_矩阵操作

    数字化方法基础(四)_矩阵操作 Chapter 7 矩阵操作 利用矩阵实现向量平移 使用矩阵实现向量旋转 如何让图形既平移又旋转 坐标系的旋转 让图形显示在屏幕中心且绕中心转动 全部教程链接: htt ...

  3. MATLAB的学习——基本操作和矩阵操作

    基本操作 命令窗口操作: clc :删除以上的操作及输出: clear x y z 删除上面的 x y z 三个变量的值 输出格式的限定 >> format long >> x ...

  4. CUDA加速计算矩阵乘法进阶玩法(共享内存)

    CUDA加速计算矩阵乘法&进阶玩法~共享内存 一.基础版矩阵乘法 二.为什么可以利用共享内存加速矩阵乘法 1.CUDA内存读写速度比较 2.申请共享内存 三.改进版矩阵乘法(利用共享内存) 一 ...

  5. Opencv Mat矩阵操作

    Opencv Mat矩阵操作 1.生成矩阵: Mat image(240, 320, CV8UC3); 第一个参数是rows,该矩阵的行数:第二个参数是cols,该矩阵的列数:第三个参数是该矩阵元素的 ...

  6. opencv求矩阵的逆_OpenCV 矩阵操作 加减乘除 求逆 行列式值 | 学步园

    GEMM 通用矩阵乘法 void cvGEMM( const CvArr* src1, const CvArr* src2, double alpha, const CvArr* src3, doub ...

  7. python 读取图片成为一维数组_python+opencv 图像的数组和矩阵操作

    在调用opencv的imread函数读取图像时,我们得到的其实是一个类型为numpy.ndarray的n维数组.这个数组的维度是[height,width,3],它是由每个像素的RGB通道的灰度值组成 ...

  8. 范德蒙德矩阵在MATLAB中怎么表示,Python 之 Python与MATLAB 矩阵操作总结

    Python 之 Python与MATLAB 矩阵操作小结 一.线形代数理论基础 线形代数(linear algebra)是数学的一个分支,研究矩阵理论.向量空间.线性变换和有限维线形方程组等内容. ...

  9. python正态分布随机数_Python使用numpy产生正态分布随机数的向量或矩阵操作示例...

    本文实例讲述了Python使用numpy产生正态分布随机数的向量或矩阵操作.分享给大家供大家参考,具体如下: 简单来说,正态分布(Normal distribution)又名高斯分布(Gaussian ...

最新文章

  1. android.util.AndroidRuntimeException: requestFeature() must be called before adding content
  2. Failed to import pydot. You must install pydot and graphviz for `pydotprint` to work.
  3. 将redis作为windows服务安装
  4. 自己用到的vim常用命令
  5. tensorflow_yolo-v3笔记 IOU:Intersection over union 交并比
  6. 【极品手机推荐】安卓3G运存16G内存,相机1300+500,三星高画质显示J7109|J7108
  7. c# 2维数组 取一维_C#| 不同类型的一维数组声明
  8. python比java慢_对于这种算法,Python与Java相比非常慢
  9. vue 属性是变量_手把手教你如何在生产环境检查 Vue 应用程序
  10. mono 最近的三条消息
  11. Spring Boot 2.0.3 使用外置 Tomcat 服务器
  12. Springboot集成Activiti7
  13. python实现一种相似图片搜索算法
  14. [深入理解Android卷一全文-第六章]深入理解Binder
  15. SBX(Simulated binary crossover)模拟二进制交叉算子和DE(differential evolution)差分进化算子...
  16. 无盘服务器接几根网线,设置无线路由器需要几根网线_安装路由器需要几根网线?-192路由网...
  17. JVM 垃圾收集器 学习笔记(《深入理解java虚拟机》之六 垃圾收集)
  18. Spherical Harmonic Lighting(球谐光照)
  19. java定时执行bat_windows定时器配置执行java jar文件的方法详解
  20. 微信鉴权服务器地址,微信开发之微信授权登录

热门文章

  1. 文件夹exe病毒的解决方法
  2. DevExpress单据模板插件
  3. 统计推断——假设检验——两变量关联性分析
  4. Python | 爬虫 | selenium自动化测试 | b站点触验证码登录
  5. 重置Windows Update以解决报错不能更新
  6. php聚丙烯酰胺,高分子聚丙烯酰胺
  7. C/C++,C++文件操作函数
  8. Android基于MQTT来实现消息通知
  9. android heic图片,如何在安卓上查看HEIC图片的内容?
  10. Qt:77---Demo(MDI多文档界面案例)