欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中圖像銳化操作的方法詳解

 更新時間:2020年11月09日 11:02:52   作者:feng之鋒  
這篇文章主要給大家介紹了關(guān)于Java中圖像銳化操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、該圖像銳化的思想:

本文的圖像銳化是將圖像中的R,G,B的值分別從原圖像中提出,然后將分別將這三個R,G,B的值分別與卷積核進行卷積,最終再將最后的三個卷積的結(jié)果合成為一個像素值,從而實現(xiàn)圖像的銳化效果。

二、整體的圖像銳化的代碼為:

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;
		//對于不同的功能設(shè)置不同大小的矩陣
//		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數(shù)組
		R = new int[size][size];
		G = new int[size][size];
		B = new int[size][size];
		//對應3*3的像素格子進行卷積計算
		for(int x = 0;x < width-size+1;x++){
			for(int y = 0;y < height-size+1;y++){
			//設(shè)置三個值分別存儲r,g,b的特征值,一定要在循環(huán)內(nèi)部進行初始化0,這樣才能每次有不同的值
				int resultOfR = 0;
				int resultOfG = 0;
				int resultOfB = 0;
				//將格子的rgb值都取出,便于之后的卷積操作
				for(int j = 0;j <size;j++){
					for(int i = 0;i < size;i++){
						//將該點的RGB信息取出,放到變量中待操作
						int argb = rgbOfImg[x][y];
						
						//分段獲取其R,G,B信息
						//int變量共4位32字節(jié),0位對應透明度(A),1位對應R值,2位對應G值,3位對應B值
						//>>操作:將二進制代碼向右移動,左邊空位根據(jù)符號補充,正號為0,負號為1,右邊超過范圍的全部舍棄
						//&:二進制位與運算符,只有兩個變量對應值均為1時該位才返回1,0xff表示全為1的十六進制數(shù)(11111111),因此任何與0xff進行位與的結(jié)果均為其本身
						//先移位后取位與可以將不同值對應的位信息取出,位與的意義是只取32字節(jié)的后8字節(jié)
						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 < size;j++){
						for(int i = 0;i < size;i++){
							resultOfR += (int)(sharpening[i][j]*R[i][j]);
						}	
					}
					for(int i = 0;i < size;i++){
						for(int j = 0;j < size;j++){
							resultOfG += (int)(sharpening[i][j]*G[i][j]);
		
						}
					}				
					for(int i = 0;i < size;i++){
						for(int j = 0;j < size;j++){
							resultOfB += (int)(sharpening[i][j]*B[i][j]);
						}
					}
				}
				//如果超過了rgb的界限(0-255),將其按照最大值或最小值處理
				if(resultOfR > 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;
				//根據(jù)該rgb值創(chuàng)建顏色對象
				Color color = new Color(resultOfR, resultOfG, resultOfB);
				//設(shè)置顏色,其中g(shù)raphics是圖像的畫布(見BufferedImage類與Graphics類)
				graphics.setColor(color);
				//畫像素點(drawline用來畫線,這里的起始與終點都是同一點,因此可以用來畫像素點)
				//size/2用來將像素點賦到中心元上
				graphics.drawLine(x+size/2, y+size/2, x+size/2, y+size/2);
				}
		}

	}
	
	// 將圖片數(shù)據(jù) 讀到數(shù)組中
		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 < w; i++) {
				for (int j = 0; j < h; j++) {
					int rgb = bi.getRGB(i, j);
					imgindex[i][j] = rgb;
					System.out.print(" " + rgb);
				}
				System.out.println();
			}
			return imgindex;

		}
}

輸出結(jié)果:

雖然這個與原圖的差別并不大,可能由于卷積核選擇的原因。

三、關(guān)鍵代碼的解讀

該段代碼主要是要去取出RGB圖像的R,G,B值,然后分別對其R,G,B值分別進行卷積操作,然后將卷積后的結(jié)果再重新整合成一個int的像素值,從而就實現(xiàn)了圖像的銳化處理。

當時看這段代碼的時候,發(fā)現(xiàn)這部分不是很懂,代碼如下:

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

不過仔細分析了一下位運算和與運算,我發(fā)現(xiàn)這段代碼就是在分別取出R,G,B的值,因為int類的像素值中是包括了a,r,g,b四個值,int是32位的,則這四個數(shù)按順序存在int中,每個數(shù)占8位。所以r對應得二進制需要去移動16位才能與oxff(即1111 1111)進行與運算,b對應得二進制需要去移動8位才能與oxff(即1111 1111)進行與運算,g就直接與oxff(即1111 1111)做與運算即可,雖然這樣表達有點難理解,那就看下面的示意圖吧:

總結(jié)

到此這篇關(guān)于Java中圖像銳化操作的文章就介紹到這了,更多相關(guān)Java圖像銳化操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論