热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

Java中图像锐化操作的方法详解

这篇文章主要给大家介绍了关于Java中图像锐化操作的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、该图像锐化的思想:

本文的图像锐化是将图像中的R,G,B的值分别从原图像中提出,然后将分别将这三个R,G,B的值分别与卷积核进行卷积,最终再将最后的三个卷积的结果合成为一个像素值,从而实现图像的锐化效果。

二、整体的图像锐化的代码为:

package com.yf1105;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;

public class ImageTest extends JFrame{
	
	public static void main(String[] args) {
		new ImageTest();
	}
	public ImageTest() {
		
		setSize(1000,700);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
		
	}
	
	@Override
	public void paint(Graphics g) {
		super.paint(g);
		int[][] rgbOfImg = getImagePixel("image/3.jpg");
		test(g, "锐化",rgbOfImg.length, rgbOfImg[0].length, rgbOfImg);
//		g.drawImage(new ImageIcon("img/hk.jpg").getImage(), 0, 0, null);
	}
	
	
	public void test(Graphics graphics,String text,int width,int height,int[][] rgbOfImg) {
		int[][] R ,G ,B;
		int size=3;
		//对于不同的功能设置不同大小的矩阵
//		if(text.equals("锐化")){size = 5;}	
		//锐化卷积核
		double[][] sharpening = {{-1,-1,-1},{-1,9,-1},{-1,-1,-1}};
//		float[][] sharpening = { { -1, -1, -1, -1, -1 }, { -1, -1, -1, -1, -1 }, { -1, -1, 25, -1, -1 },
//				{ -1, -1, -1, -1, -1 }, { -1, -1, -1, -1, -1 } };
		//下面开始搞卷积算法
		//初始化rgb数组
		R = new int[size][size];
		G = new int[size][size];
		B = new int[size][size];
		//对应3*3的像素格子进行卷积计算
		for(int x = 0;x >操作:将二进制代码向右移动,左边空位根据符号补充,正号为0,负号为1,右边超过范围的全部舍弃
						//&:二进制位与运算符,只有两个变量对应值均为1时该位才返回1,0xff表示全为1的十六进制数(11111111),因此任何与0xff进行位与的结果均为其本身
						//先移位后取位与可以将不同值对应的位信息取出,位与的意义是只取32字节的后8字节
						R[i][j] = argb>>16 & 0xff;
						G[i][j] = argb>>8 & 0xff;
						B[i][j] = argb  & 0xff;
					}
				}
				if(text.equals("锐化")){
					//分别对R,G,B进行卷积操作,对应相乘后加起来
					for(int j = 0;j  255)resultOfR = 255;
				if(resultOfR <0)resultOfR = 0;
				if(resultOfG > 255)resultOfG = 255;
				if(resultOfG <0)resultOfG = 0;
				if(resultOfB > 255)resultOfB = 255;
				if(resultOfB <0)resultOfB = 0;
				//根据该rgb值创建颜色对象
				Color color = new Color(resultOfR, resultOfG, resultOfB);
				//设置颜色,其中graphics是图像的画布(见BufferedImage类与Graphics类)
				graphics.setColor(color);
				//画像素点(drawline用来画线,这里的起始与终点都是同一点,因此可以用来画像素点)
				//size/2用来将像素点赋到中心元上
				graphics.drawLine(x+size/2, y+size/2, x+size/2, y+size/2);
				}
		}

	}
	
	// 将图片数据 读到数组中
		public int[][] getImagePixel(String image) {
			BufferedImage bi = null;
			File file = new File(image);

			try {
				bi = ImageIO.read(file);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			int w = bi.getWidth();
			int h = bi.getHeight();
			int imgindex[][] = new int[w][h];

			for (int i = 0; i 

输出结果:

虽然这个与原图的差别并不大,可能由于卷积核选择的原因。

三、关键代码的解读

该段代码主要是要去取出RGB图像的R,G,B值,然后分别对其R,G,B值分别进行卷积操作,然后将卷积后的结果再重新整合成一个int的像素值,从而就实现了图像的锐化处理。

当时看这段代码的时候,发现这部分不是很懂,代码如下:

R[i][j] = argb>>16 & 0xff;
G[i][j] = argb>>8 & 0xff;
B[i][j] = argb  & 0xff;

不过仔细分析了一下位运算和与运算,我发现这段代码就是在分别取出R,G,B的值,因为int类的像素值中是包括了a,r,g,b四个值,int是32位的,则这四个数按顺序存在int中,每个数占8位。所以r对应得二进制需要去移动16位才能与oxff(即1111 1111)进行与运算,b对应得二进制需要去移动8位才能与oxff(即1111 1111)进行与运算,g就直接与oxff(即1111 1111)做与运算即可,虽然这样表达有点难理解,那就看下面的示意图吧:

总结

到此这篇关于Java中图像锐化操作的文章就介绍到这了,更多相关Java图像锐化操作内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • 非公版RTX 3080显卡的革新与亮点
    本文深入探讨了图形显卡的进化历程,重点介绍了非公版RTX 3080显卡的技术特点和创新设计。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文介绍如何利用动态规划算法解决经典的0-1背包问题。通过具体实例和代码实现,详细解释了在给定容量的背包中选择若干物品以最大化总价值的过程。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文探讨如何设计一个安全的加密和验证算法,确保生成的密码具有高随机性和低重复率,并提供相应的验证机制。 ... [详细]
  • 深入解析:手把手教你构建决策树算法
    本文详细介绍了机器学习中广泛应用的决策树算法,通过天气数据集的实例演示了ID3和CART算法的手动推导过程。文章长度约2000字,建议阅读时间5分钟。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
author-avatar
尼姆了_960
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有