槑图秀秀

  • 前言
  • 一、图像处理是什么?
  • 二、PS软件介绍
    • 用户界面及特性
  • 三、项目难点介绍
    • 1. 卷积
    • 2.图片均衡化
  • 总结

前言

本次adalab项目主要是以学习图像处理算法方面。
主要知识点为数组。


一、图像处理是什么?

图像处理是指对图像进行分析、加工、和处理,使其满足视觉、心理或其他要求的技术。图像处理是信号处理在图像领域上的一个应用。目前大多数的图像均是以数字形式存储,因而图像处理很多情况下指数字图像处理。此外,基于光学理论的处理方法依然占有重要的地位。

图像处理是信号处理的子类,另外与计算机科学、人工智能等领域也有密切的关系。

传统的一维信号处理的方法和概念很多仍然可以直接应用在图像处理上,比如降噪、量化等。然而,图像属于二维信号,和一维信号相比,它有自己特殊的一面,处理的方式和角度也有所不同。

二、PS软件介绍

用户界面及特性


基础功能:
逆时针和顺时针旋转、水平旋转、反相、绿屏抠图、卷积、裁剪、均衡化。

产品特性:
1.乡村滤镜
2.二值化
3.图片去色
4.马赛克
5.浮雕化

待开发特性:
1.放大镜(目前仍然有bug)
2.各种滤镜
3.美颜功能


三、项目难点介绍

1. 卷积

二维卷积

二维卷积是我们最常用的也是最重要的,图像的边缘计算和模糊等算法都是基于卷积操作的只不过是对应的不同计算,卷积滤波器不同。


这里的kernel就是卷积核,kernel_size的大小一般是(3, 3)、(5, 5)、(7、7)这里是奇数的原因是因为方便计算。

代码展示:

 /*** Method: 图片卷积** @param source* @return*/public GImage convolution(GImage source) {int[][] pixelArray = source.getPixelArray();int pixelOfPhotoHeight = pixelArray.length;int pixelOfPhotoWidth = pixelArray[0].length;int[][] newPixelArray = new int[pixelOfPhotoHeight][pixelOfPhotoWidth];for (int y = 0; y < pixelOfPhotoHeight; y++) {for (int x = 0; x < pixelOfPhotoWidth; x++) {newPixelArray[y][x] = getPixel(pixelArray, x, y);}}return new GImage(newPixelArray);}/*** Method: 获得图片卷积参数** @param pixelArray* @param x* @param y* @return*/private int getPixel(int[][] pixelArray, int x, int y) {int pixelOfPhotoHeight = pixelArray.length;int pixelOfPhotoWidth = pixelArray[0].length;int rSum = 0;int bSum = 0;int gSum = 0;int pixelCount = 0;        // 计算卷积时,使用的像素点数int xMin = Math.max(x - CONVOLUTION_RADIUS, 0);int xMax = Math.min(x + CONVOLUTION_RADIUS, pixelOfPhotoWidth - 1);int yMin = Math.max(y - CONVOLUTION_RADIUS, 0);int yMax = Math.min(y + CONVOLUTION_RADIUS, pixelOfPhotoHeight - 1);for (int row = yMin; row <= yMax; row++) {for (int col = xMin; col <= xMax; col++) {int pixel = pixelArray[row][col];rSum += GImage.getRed(pixel);bSum += GImage.getBlue(pixel);gSum += GImage.getGreen(pixel);pixelCount++;System.out.println(row + " " + col + " " + pixelCount);}}return GImage.createRGBPixel(rSum / pixelCount, gSum / pixelCount, bSum / pixelCount);}

主要步骤:
通过长度为1的卷积半径来获取周围的像素点,再通过计算图片中当前像素点和周围像素点相加的rgb像素值,再除以总像素点(一般为9个像素点)实现卷积效果

2.图片均衡化

均衡化是一种主要应用于灰度照片的图像处理算法,可以增强画面对比度。

均衡化效果(如下):

代码如下:

/*** Method: 均衡化** @param source* @return*/public GImage equalization(GImage source) {int[] luminosityStatus = getLuminosityStatus(source);int[][] pixelArray = source.getPixelArray();int pixelOfPhotoHeight = pixelArray.length;int pixelOfPhotoWidth = pixelArray[0].length;for (int row = 0; row < pixelOfPhotoHeight; row++) {for (int col = 0; col < pixelOfPhotoWidth; col++) {int pixel = pixelArray[row][col];int r = GImage.getRed(pixel);int g = GImage.getGreen(pixel);int b = GImage.getBlue(pixel);int luminosity = computeLuminosity(r, g, b);int totalNumOfPixel = totalPixels(luminosityStatus, 0, luminosity + 1);int averageOfRGB = 255 * totalNumOfPixel / (pixelOfPhotoHeight * pixelOfPhotoWidth);int newImage = GImage.createRGBPixel(averageOfRGB, averageOfRGB, averageOfRGB);pixelArray[row][col] = newImage;}}return new GImage(pixelArray);}/*** Method: 获取当前像素点的亮度** @param source* @return*/private int[] getLuminosityStatus(GImage source) {int[][] pixelArray = source.getPixelArray();int pixelOfPhotoHeight = pixelArray.length;int pixelOfPhotoWidth = pixelArray[0].length;int[] luminosityStatus = new int[256];for (int row = 0; row < pixelOfPhotoHeight; row++) {for (int col = 0; col < pixelOfPhotoWidth; col++) {int pixel = pixelArray[row][col];int r = GImage.getRed(pixel);int g = GImage.getGreen(pixel);int b = GImage.getBlue(pixel);int luminosity = computeLuminosity(r, g, b);luminosityStatus[luminosity] += 1;}}return luminosityStatus;}/*** Method: 所有像素点** @param quantityOfPixel* @param beg* @param end* @return*/private int totalPixels(int[] quantityOfPixel, int beg, int end) {int total = 0;for (int a = beg; a < end; a++) {total += quantityOfPixel[a];}return total;}

实现步骤

首先需要计算亮度

亮度算法:

/* 计算图片亮度 */
public default int computeLuminosity(int r, int g, int b) {return GMath.round(0.299 * r + 0.587 * g + 0.114 * b);

使用方式:

int luminosity = computeLuminosity(red, green, blue);

然后调整颜色

调整颜色时,R、G、B三个通道会被调整为相等的值,都等于 255 * 亮度小于等于当前像素的像素个数 / 整张图片的像素数量 ,小数结果向下取整即可。


总结

图像处理项目让我初步了解算法知识和数组知识点,但我的主要问题还是无法独立完成项目,需要经常看别人代码和讲解才能一点一点摸出来。
总而言之,挤出时间学习java知识点以及学习好编程类英语知识,希望有一天能读懂英文Manual。

槑图秀秀 (初学JAVA第三篇)相关推荐

  1. java美图秀秀_[Java教程]简易版美图秀秀_星空网

    简易版美图秀秀 2016-10-30 0 简易板美图秀秀灰度 黑白 底片 模糊 马赛克 简单的实现了 灰度,黑白,底片,模糊,马赛克(代码比较简单,通过canvas实现的) 感觉挺有意思的,上面解释很 ...

  2. 初学Java(三)——学习准备

    网上有很多教程资源,如果想要什么资源可以先试试从B站搜,B站可以搜到很多类型的资源,包括编程教程.英语教程.软件使用教程等都有. 以下是网上搜集的Java学习路线教程,学习Java选择其中一个教程跟着 ...

  3. 魔域-文字rpg(初学Java第四篇)

    Zork 前言 游戏界面及特性介绍 一.Code Refactoring 二.Composition and Inheritance 1.继承 2.组合 三.I/O Streams 总结 前言 学习目 ...

  4. Tetris(初学Java第六篇)

    欢迎来到bruno的blog. Tetris 应用介绍 El-Tetris算法 单元测试 总结 Tetris 此次项目学习涉及了多方面的知识,如:单元测试,AI算法基础,注解等方面. 应用介绍 在El ...

  5. Python GUI案例之看图猜成语开发(第三篇)

    Python GUI案例之看图猜成语(第三篇) 前言 看图猜成语小程序开发(第三篇) 游戏闯关模式页面 Python GUI案例之看图猜成语开发(第一篇) Python GUI案例之看图猜成语开发(第 ...

  6. 03_美图秀秀实现思路

    LOMO其实是一个早期的苏联的相机厂.五六十年代产了一些廉价的比较实用的相机.后来苏联解体之后这个相机厂就不产了.九十年代的时候有一个叫杰克的哥们,去货摊上找到了一个全新的没开封的这个LOMO相机,照 ...

  7. 三篇ICLR2022与时间图序列相关的研究工作

    时序图学习研究多了||三篇ICLR与时间图序列相关的研究工作 1. 时空图神经网络 title: Space-Time Graph Neural Networks 作者:Samar Hadou, Ch ...

  8. Android JNI实现Java与C/C++互相调用,以及so库的生成和调用(JNI方式调用美图秀秀so)

    前言 关于Android Studio如何继承JNI开发环境,请阅读上一篇博文 Android CMake集成JNI开发环境本篇博文将结合实例分别讲解Android中Java如何调用C/C++的方法, ...

  9. 初学Python——文件操作第三篇

    一.引言 什么?有了第二篇文件操作还不够?远远不够!而且在读完第三篇文件操作还是不够.关于文件的操作,后续的学习中将不断学习新的操作方式,使用更加合适的方法. 进入正题,上一篇讲到,Python对文件 ...

  10. 《Head First Java》的思考总结:第三篇

    前言: 今天要分享的是关于 <Head First Java>这本书的读后感,这本书有点小厚差不多有七百页左右,所以我花了几乎整个国庆的时间去阅读,学习.读完之后发现,受益颇多.正如书名所 ...

最新文章

  1. MySQL主从复制配置过程(一主一从模式)
  2. Intellij Idea:导入Gradle项目 - 尚未定义JAVA_HOME
  3. 分享8点超级有用的Python编程建议
  4. 从零开始配置MySQL MMM
  5. 报错:“-bash: git: 未找到命令”
  6. 洛谷 2585 [ZJOI2006]三色二叉树——树形dp
  7. 【WebRTC---进阶篇】(二)libevent实现高性能网络服务器
  8. 【HDU - 5489】Removed Interval(离散化,权值线段树,思维,最长上升子序列)
  9. SprinBoot 集成 Flowable/Activiti工作流引擎
  10. linux下expdp定时备份_Linux 自动备份 Oracle 数据库 Shell 脚本
  11. Eclipse is running in a JRE, but a JDK is required
  12. (100)详细描述一个你做过的项目, 面试必问(二十四)(第20天)
  13. 百战java课程_java百战程序员SpringBoot视频教程
  14. base64原理解析
  15. 使用安全浏览器将网页保存为pdf的方法步骤
  16. PCIe+Switch高速存储方案设计
  17. ERR_CACHE_MISS的解决方案
  18. rust货轮什么时候出现_面食究竟是什么时候出现的?浅谈古代面食发展和变迁史...
  19. 【spring_Cloud】java.lang.IllegalStateException: Failed to introspect Class [org.springframework.cloud
  20. linux 喂狗时间,看门狗喂狗时间及程序

热门文章

  1. KGB知识图谱深入挖掘金融行业的知识关联
  2. ❤️FFmpeg❤️ MP4格式文件,将MPEG4的编码方式转为H.264
  3. 如何升级到 Ubuntu 20.04
  4. 网络安全诉讼风险:首席信息安全官最关心的4个问题
  5. EasyBoot使用方法
  6. scannable dest type struct with >1 columns (3) in result
  7. SpringCloud优点、缺点
  8. php如何本地运行_怎样在本地运行PHP
  9. 新体育杂志新体育杂志社新体育杂志社新体育编辑部2022年第8期目录
  10. 如何用邮件客户端收发电子邮件,如何配置邮件客户端?