真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

java圖像處理代碼 java繪制圖片代碼

java代碼怎么實(shí)現(xiàn)計(jì)算圖像二值連通區(qū)域的質(zhì)心

一:幾何距(Geometric

創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括克州網(wǎng)站建設(shè)、克州網(wǎng)站制作、克州網(wǎng)頁制作以及克州網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,克州網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到克州省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

Moments)知識(shí)與質(zhì)心尋找原理

1.

Image

Moments是圖像處理中非常有用的算法,可以用來計(jì)算區(qū)域圖像的質(zhì)心,方向等幾何特性,同時(shí)Mpq的高階具有旋轉(zhuǎn)不變性,可以用來實(shí)現(xiàn)圖像比較分類,正是因?yàn)镸oments有這些特性,很多手繪油畫效果也會(huì)基于該算法來模擬實(shí)現(xiàn)。它的數(shù)學(xué)表達(dá)為:

它的低階M00,M01,

M10可以用來計(jì)算質(zhì)心,中心化以后M11,M02,M20可以用來計(jì)算區(qū)域的方向/角度

2.

什么是質(zhì)心

就是通過該點(diǎn),區(qū)域達(dá)到一種質(zhì)量上的平衡狀態(tài),可能物理學(xué)上講的比較多,簡單點(diǎn)的說就是規(guī)則幾何物體的中心,不規(guī)則的可以通過掛繩子的方法來尋找。

二:算法流程

1.

輸入圖像轉(zhuǎn)換為二值圖像

2.

通過連通組件標(biāo)記算法找到所有的連通區(qū)域,并分別標(biāo)記

3.

對(duì)每個(gè)連通區(qū)域運(yùn)用計(jì)算幾何距算法得到質(zhì)心

4.

用不同顏色繪制連通區(qū)域與質(zhì)心,輸出處理后圖像

三:算法效果

左邊為原圖,

右邊藍(lán)色為連通組件標(biāo)記算法處理以后結(jié)果,白色點(diǎn)為質(zhì)心

四:關(guān)鍵代碼解析

1.

計(jì)算幾何距算法代碼

doublem00

=

moments(pixels,

width,

height,

0,

0);

doublexCr

=

moments(pixels,

width,

height,

1,

0)

/

m00;//

row

doubleyCr

=

moments(pixels,

width,

height,

0,

1)

/

m00;//

column

return

new

double[]{xCr,

yCr};

java數(shù)字圖像處理常用算法

前些時(shí)候做畢業(yè)設(shè)計(jì) 用java做的數(shù)字圖像處理方面的東西 這方面的資料ms比較少 發(fā)點(diǎn)東西上來大家共享一下 主要就是些算法 有自己寫的 有人家的 還有改人家的 有的算法寫的不好 大家不要見笑

一 讀取bmp圖片數(shù)據(jù)

//? 獲取待檢測圖像? 數(shù)據(jù)保存在數(shù)組 nData[] nB[]? nG[]? nR[]中

public? void getBMPImage(String source) throws Exception {?????????? ???????? clearNData();??????????????????????? //清除數(shù)據(jù)保存區(qū)???????? FileInputStream fs = null;?????????????? try {??????????? fs = new FileInputStream(source);??????????? int bfLen = ;??????????? byte bf[] = new byte[bfLen];??????????? fs read(bf bfLen); // 讀取 字節(jié)BMP文件頭??????????? int biLen = ;??????????? byte bi[] = new byte[biLen];??????????? fs read(bi biLen); // 讀取 字節(jié)BMP信息頭

// 源圖寬度??????????? nWidth = (((int) bi[ ] xff) )??????????????????? | (((int) bi[ ] xff) )??????????????????? | (((int) bi[ ] xff) ) | (int) bi[ ] xff;

// 源圖高度??????????? nHeight = (((int) bi[ ] xff) )??????????????????? | (((int) bi[ ] xff) )??????????????????? | (((int) bi[ ] xff) ) | (int) bi[ ] xff;

// 位數(shù)??????????? nBitCount = (((int) bi[ ] xff) ) | (int) bi[ ] xff;

// 源圖大小??????????? int nSizeImage = (((int) bi[ ] xff) )??????????????????? | (((int) bi[ ] xff) )??????????????????? | (((int) bi[ ] xff) ) | (int) bi[ ] xff;

// 對(duì) 位BMP進(jìn)行解析??????????? if (nBitCount == ){??????????????? int nPad = (nSizeImage / nHeight) nWidth * ;??????????????? nData = new int[nHeight * nWidth];??????????????? nB=new int[nHeight * nWidth];??????????????? nR=new int[nHeight * nWidth];??????????????? nG=new int[nHeight * nWidth];??????????????? byte bRGB[] = new byte[(nWidth + nPad) * * nHeight];??????????????? fs read(bRGB (nWidth + nPad) * * nHeight);??????????????? int nIndex = ;??????????????? for (int j = ; j nHeight; j++){??????????????????? for (int i = ; i nWidth; i++) {??????????????????????? nData[nWidth * (nHeight j ) + i] = ( xff) ??????????????????????????????? | (((int) bRGB[nIndex + ] xff) )???????????????????????????????? | (((int) bRGB[nIndex + ] xff) )??????????????????????????????? | (int) bRGB[nIndex] xff;????????????????????? ??????????????????????? nB[nWidth * (nHeight j ) + i]=(int) bRGB[nIndex] xff;??????????????????????? nG[nWidth * (nHeight j ) + i]=(int) bRGB[nIndex+ ] xff;??????????????????????? nR[nWidth * (nHeight j ) + i]=(int) bRGB[nIndex+ ] xff;??????????????????????? nIndex += ;??????????????????? }??????????????????? nIndex += nPad;??????????????? }?//?????????????? Toolkit kit = Toolkit getDefaultToolkit();?//?????????????? image = kit createImage(new MemoryImageSource(nWidth nHeight ?//?????????????????????? nData nWidth));

/*?????????????? //調(diào)試數(shù)據(jù)的讀取

FileWriter fw = new FileWriter( C:\\Documents and Settings\\Administrator\\My Documents\\nDataRaw txt );//創(chuàng)建新文件??????????????? PrintWriter out = new PrintWriter(fw);??????????????? for(int j= ;jnHeight;j++){??????????????? ?for(int i= ;inWidth;i++){??????????????? ??out print(( * +nData[nWidth * (nHeight j ) + i])+ _ ??????????????? ????+nR[nWidth * (nHeight j ) + i]+ _ ??????????????? ????+nG[nWidth * (nHeight j ) + i]+ _ ??????????????? ????+nB[nWidth * (nHeight j ) + i]+ );??????????????? ????????????????? ?}??????????????? ?out println( );??????????????? }??????????????? out close();*/????????? ??????????? }??????? }??????? catch (Exception e) {??????????? e printStackTrace();??????????? throw new Exception(e);??????? } ??????? finally {??????????? if (fs != null) {??????????????? fs close();??????????? }??????? }???? //?? return image;??? }

二?由r g b 獲取灰度數(shù)組

public? int[] getBrightnessData(int rData[] int gData[] int bData[]){??? ???? ?int brightnessData[]=new int[rData length];??? ?if(rData length!=gData length || rData length!=bData length??? ???|| bData length!=gData length){??? ??return brightnessData;??? ?}??? ?else {??? ??for(int i= ;ibData length;i++){??? ???double temp= *rData[i]+ *gData[i]+ *bData[i];??? ???brightnessData[i]=(int)(temp)+((temp (int)(temp)) ? : );??? ??}??? ??return brightnessData;??? ?}??? ? ??? }?

三 直方圖均衡化

public int [] equilibrateGray(int[] PixelsGray int width int height) ??? {??????? ????????? int gray;???????? int length=PixelsGray length;???????? int FrequenceGray[]=new int[length]; ???????? int SumGray[]=new int[ ]; ???????? int ImageDestination[]=new int[length];???????? for(int i = ; i length ;i++) ??????? { ??????? ?? gray=PixelsGray[i]; ????????????? FrequenceGray[gray]++; ??????? } ????????? //??? 灰度均衡化 ???????? SumGray[ ]=FrequenceGray[ ]; ???????? for(int i= ;i ;i++){?????????????? SumGray[i]=SumGray[i ]+FrequenceGray[i];? ???????? }???????? for(int i= ;i ;i++) {?????????????? SumGray[i]=(int)(SumGray[i]* /length);? ???????? }???????? for(int i= ;iheight;i++) ???????? { ?????????????? for(int j= ;jwidth;j++) ????????????? { ????????????????? int k=i*width+j; ????????????????? ImageDestination[k]= xFF | ((SumGray[PixelsGray[k]] ??????????????????????????? ) | (SumGray[PixelsGray[k]] ) | SumGray[PixelsGray[k]]); ?????????????? } ????????? }???????? return ImageDestination;????? }?

四 laplace 階濾波 增強(qiáng)邊緣 圖像銳化

public int[] laplace DFileter(int []data int width int height){??? ??? ?int filterData[]=new int[data length];??? ?int min= ;??? ?int max= ;??? ?for(int i= ;iheight;i++){??? ??for(int j= ;jwidth;j++){??? ???if(i== || i==height || j== || j==width )??? ?????????? filterData[i*width+j]=data[i*width+j];??? ???else??? ????filterData[i*width+j]= *data[i*width+j] data[i*width+j ] data[i*width+j+ ]??? ???????????????????????? data[(i )*width+j] data[(i )*width+j ] data[(i )*width+j+ ]??? ???????????????????????? data[(i+ )*width+j] data[(i+ )*width+j ] data[(i+ )*width+j+ ];??? ?????? ???if(filterData[i*width+j]min)??? ????min=filterData[i*width+j];??? ???if(filterData[i*width+j]max)??? ????max=filterData[i*width+j];??? ??}????? ?}//??? ?System out println( max: +max);//??? ?System out println( min: +min);??? ???? ?for(int i= ;iwidth*height;i++){??? ??filterData[i]=(filterData[i] min)* /(max min);??? ?}??? ?return filterData;??? }?

五 laplace 階增強(qiáng)濾波 增強(qiáng)邊緣 增強(qiáng)系數(shù)delt

public int[] laplaceHigh DFileter(int []data int width int height double delt){??? ???? ?int filterData[]=new int[data length];??? ?int min= ;??? ?int max= ;??? ?for(int i= ;iheight;i++){??? ??for(int j= ;jwidth;j++){??? ???if(i== || i==height || j== || j==width )??? ?????????? filterData[i*width+j]=(int)(( +delt)*data[i*width+j]);??? ???else??? ????filterData[i*width+j]=(int)(( +delt)*data[i*width+j] data[i*width+j ]) data[i*width+j+ ]??? ???????????????????????? data[(i )*width+j] data[(i )*width+j ] data[(i )*width+j+ ]??? ???????????????????????? data[(i+ )*width+j] data[(i+ )*width+j ] data[(i+ )*width+j+ ];??? ?????? ???if(filterData[i*width+j]min)??? ????min=filterData[i*width+j];??? ???if(filterData[i*width+j]max)??? ????max=filterData[i*width+j];??? ??}????? ?}??? ?for(int i= ;iwidth*height;i++){??? ??filterData[i]=(filterData[i] min)* /(max min);??? ?}??? ?return filterData;??? }? 六 局部閾值處理 值化

//?? 局部閾值處理 值化 niblack s?? method??? /*原理 ?? ???????? T(x y)=m(x y)?? +?? k*s(x y)?? ???????? 取一個(gè)寬度為w的矩形框 (x y)為這個(gè)框的中心 ???????? 統(tǒng)計(jì)框內(nèi)數(shù)據(jù) T(x y)為閾值 m(x y)為均值 s(x y)為均方差 k為參數(shù)(推薦 )計(jì)算出t再對(duì)(x y)進(jìn)行切割 / ?? ???????? 這個(gè)算法的優(yōu)點(diǎn)是???? 速度快 效果好 ?? ???????? 缺點(diǎn)是???? niblack s?? method會(huì)產(chǎn)生一定的噪聲 ? ???? */??? ??? public int[] localThresholdProcess(int []data int width int height int w int h double coefficients double gate){??? ?int[] processData=new int[data length];??? ?for(int i= ;idata length;i++){??? ??processData[i]= ;??? ?}??? ???? ?if(data length!=width*height)??? ??return processData;??? ???? ?int wNum=width/w;??? ?int hNum=height/h;??? ?int delt[]=new int[w*h];??? ???? ?//System out println( w; +w+ ? h: +h+ ? wNum: +wNum+ hNum: +hNum);??? ???? ?for(int j= ;jhNum;j++){??? ??for(int i= ;iwNum;i++){??? ?//for(int j= ;j ;j++){??? ?//?for(int i= ;i ;i++){???? ??? for(int n= ;nh;n++)??? ?????????? for(int k= ;kw;k++){??? ????? ????? delt[n*w+k]=data[(j*h+n)*width+i*w+k];??? ????? ????? //System out print( delt[ +(n*w+k)+ ]: +delt[n*w+k]+ );??? ?????????? }??? ??? //System out println();??? ??? /*??? ??? for(int n= ;nh;n++)??? ?????????? for(int k= ;kw;k++){??? ????? ????? System out print( data[ +((j*h+n)*width+i*w+k)+ ]: +data[(j*h+n)*width+i*w+k]+ );??? ?????????? }??? ??? System out println();??? ??? */??? ??? delt=thresholdProcess(delt w h coefficients gate);??? ??? for(int n= ;nh;n++)??? ?????????? for(int k= ;kw;k++){??? ????? ????? processData[(j*h+n)*width+i*w+k]=delt[n*w+k];??? ????? ???? // System out print( delt[ +(n*w+k)+ ]: +delt[n*w+k]+ );??? ?????????? }??? ??? //System out println();??? ??? /*??? ??? for(int n= ;nh;n++)??? ?????????? for(int k= ;kw;k++){??? ????? ????? System out print( processData[ +((j*h+n)*width+i*w+k)+ ]: +processData[(j*h+n)*width+i*w+k]+ );??? ?????????? }??? ??? System out println();??? ??? */??? ??} ??? ?}??? ???? ?return processData;??? }?

七 全局閾值處理 值化

public int[] thresholdProcess(int []data int width int height double coefficients double gate){??? ?int [] processData=new int[data length];??? ?if(data length!=width*height)??? ??return processData;??? ?else{??? ??double sum= ;??? ??double average= ;??? ??double variance= ;??? ??double threshold;??? ????? ??if( gate!= ){??? ???threshold=gate;???? ??}??? ??else{??? ??????? for(int i= ;iwidth*height;i++){??? ???? ?? sum+=data[i];??? ??????? }??? ??????? average=sum/(width*height);??? ????? ??????? for(int i= ;iwidth*height;i++){??? ???? ???? variance+=(data[i] average)*(data[i] average);??? ??????? }??? ??????? variance=Math sqrt(variance);??? ??????? threshold=average coefficients*variance;??? ??}??? ????? ???? for(int i= ;iwidth*height;i++){??? ???? ?if(data[i]threshold)??? ???? ??? processData[i]= ;??? ???? ?else ??? ???? ?????? processData[i]= ;??? ???? }??? ????? ???? return processData;?????? }??? }?

八 ?垂直邊緣檢測 sobel算子

public int[] verticleEdgeCheck(int []data int width int height int sobelCoefficients) throws Exception{??? ?int filterData[]=new int[data length];??? ?int min= ;??? ?int max= ;??? ?if(data length!=width*height)??? ??return filterData;??? ???? ?try{??? ???? ?? for(int i= ;iheight;i++){??? ?? for(int j= ;jwidth;j++){??? ??? if(i== || i== || i==height || i==height ??? ?????? ||j== || j== || j==width || j==width ){??? ?????????? filterData[i*width+j]=data[i*width+j];??? ???? }??? ???? else{??? ????? double average;??? ??????? //中心的九個(gè)像素點(diǎn)??? ???????? //average=data[i*width+j] Math sqrt( )*data[i*width+j ]+Math sqrt( )*data[i*width+j+ ]??? ????? average=data[i*width+j] sobelCoefficients*data[i*width+j ]+sobelCoefficients*data[i*width+j+ ]?????? ??? ????????????? data[(i )*width+j ]+data[(i )*width+j+ ]??? ???????????????? data[(i+ )*width+j ]+data[(i+ )*width+j+ ];??? ???????? filterData[i*width+j]=(int)(average);??? ???? }?? ??? ??? ??? if(filterData[i*width+j]min)???? ????min=filterData[i*width+j];???? ??? if(filterData[i*width+j]max)???? ????max=filterData[i*width+j];??? ??? }??? ??? }??? ?? for(int i= ;iwidth*height;i++){????? ??filterData[i]=(filterData[i] min)* /(max min);????? ?? }??? ???? ?}??? ?catch (Exception e) ??? ?{??????????? e printStackTrace();??????????? throw new Exception(e);??????? }? ??? ???? ?return filterData;??? }?

九 ?圖像平滑 * 掩模處理(平均處理) 降低噪聲

lishixinzhi/Article/program/Java/hx/201311/26286

《JAVA數(shù)字圖像處理》pdf下載在線閱讀全文,求百度網(wǎng)盤云資源

《JAVA數(shù)字圖像處理》百度網(wǎng)盤pdf最新全集下載:

鏈接:

?pwd=f8sq 提取碼: f8sq

簡介:在開始本書內(nèi)容之前,筆者假設(shè)你已經(jīng)有了面向?qū)ο笳Z言編程的基本概念,了解Java語言的基本語法與特征,原因在于本書的所有源代碼都是基于Java語言實(shí)現(xiàn)的,而且是基于Java開發(fā)環(huán)境運(yùn)行與演示所有圖像處理算法的。本書第1章到第3章是為了幫助讀者了解與掌握J(rèn)ava圖形與GUI編程的基本知識(shí)與概念而寫的。本章主要介紹Java GUI編程中基本的圖形知識(shí),針對(duì)GU1編程,Java語言提供了兩套幾乎并行的API,分別是Swing與AWT。早期的Java GUJ編程中主要使用AWT的相關(guān)組件,但是AWT的功能并不是十分強(qiáng)大,而且嚴(yán)重依賴本地接口。于是在Java 1.3及后續(xù)版本中引入了Swing工具實(shí)現(xiàn)GUl編程,Swing中的組件大多數(shù)都是基于純Java語言實(shí)現(xiàn)的,而不是通過本地組件實(shí)現(xiàn)的,所以它們是輕量級(jí)的GUI組件,同時(shí)Swing對(duì)圖形與圖像的支持操作也有很大的提高與增強(qiáng)。如何區(qū)分AWT組件與Swing組件?一個(gè)簡單而且相當(dāng)直觀的方法是看Class的名稱,Swing的組件大多數(shù)帶有大寫的前綴字母J。 ?

關(guān)于JAVA的圖片處理問題

public static boolean write(RenderedImage im, String formatName, File output) throws IOException

使用支持給定格式的任意 ImageWriter 將一個(gè)圖像寫入 File。如果已經(jīng)有一個(gè) File 存在,則丟棄其內(nèi)容。

參數(shù):im - 要寫入的 RenderedImage。

formatName - 包含格式非正式名稱的 String。

output - 將在其中寫入數(shù)據(jù)的 File。

返回:如果沒有找到合適的 writer,則返回 false。

拋出: IllegalArgumentException - 如果任何參數(shù)為 null。

IOException - 如果在寫入過程中發(fā)生錯(cuò)誤。

說白了,就是按指定的formatName把圖片存到file(或OutputStream)中。formatName是已注冊(cè)的、可以保存圖片的writer的非正式名稱,比如“jpeg”,“tiff”。如果想知道到底有哪些writer在你的機(jī)器上被注冊(cè)了,用ImageIO.getWriterFormatNames(),返回類型是String[] 。同樣的,還有讀取圖片的reader,對(duì)應(yīng)的是ImageIO.getReaderFormatNames()。

最后要說的是,這個(gè)方法是保存圖片,和上傳沒有關(guān)系。你可能是要上傳圖片后再保存吧!

新手學(xué)習(xí)使用Java,嘗試著做一個(gè)項(xiàng)目使用Java做一個(gè)視頻圖像的處理。

Java圖像處理技巧四則

下面代碼中用到的sourceImage是一個(gè)已經(jīng)存在的Image對(duì)象

圖像剪切

對(duì)于一個(gè)已經(jīng)存在的Image對(duì)象,要得到它的一個(gè)局部圖像,可以使用下面的步驟:

//import java.awt.*;

//import java.awt.image.*;

Image croppedImage;

ImageFilter cropFilter;

CropFilter =new CropImageFilter(25,30,75,75); //四個(gè)參數(shù)分別為圖像起點(diǎn)坐標(biāo)和寬高,即CropImageFilter(int x,int y,int width,int height),詳細(xì)情況請(qǐng)參考API

CroppedImage= Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(sourceImage.getSource(),cropFilter));

如果是在Component的子類中使用,可以將上面的Toolkit.getDefaultToolkit().去掉。FilteredImageSource是一個(gè)ImageProducer對(duì)象。

圖像縮放

對(duì)于一個(gè)已經(jīng)存在的Image對(duì)象,得到它的一個(gè)縮放的Image對(duì)象可以使用Image的getScaledInstance方法:

Image scaledImage=sourceImage. getScaledInstance(100,100, Image.SCALE_DEFAULT); //得到一個(gè)100X100的圖像

Image doubledImage=sourceImage. getScaledInstance(sourceImage.getWidth(this)*2,sourceImage.getHeight(this)*2, Image.SCALE_DEFAULT); //得到一個(gè)放大兩倍的圖像,這個(gè)程序一般在一個(gè)swing的組件中使用,而類Jcomponent實(shí)現(xiàn)了圖像觀察者接口ImageObserver,所有可以使用this。

//其它情況請(qǐng)參考API

灰度變換

下面的程序使用三種方法對(duì)一個(gè)彩色圖像進(jìn)行灰度變換,變換的效果都不一樣。一般而言,灰度變換的算法是將象素的三個(gè)顏色分量使用R*0.3+G*0.59+ B*0.11得到灰度值,然后將之賦值給紅綠藍(lán),這樣顏色取得的效果就是灰度的。另一種就是取紅綠藍(lán)三色中的最大值作為灰度值。java核心包也有一種算法,但是沒有看源代碼,不知道具體算法是什么樣的,效果和上述不同。

/* GrayFilter.java*/

/*@author:cherami */

/*email:cherami@163.net*/

import java.awt.image.*;

public class GrayFilter extends RGBImageFilter {

int modelStyle;

public GrayFilter() {

modelStyle=GrayModel.CS_MAX;

canFilterIndexColorModel=true;

}

public GrayFilter(int style) {

modelStyle=style;

canFilterIndexColorModel=true;

}

public void setColorModel(ColorModel cm) {

if (modelStyle==GrayModel

else if (modelStyle==GrayModel

}

public int filterRGB(int x,int y,int pixel) {

return pixel;

}

}

/* GrayModel.java*/

/*@author:cherami */

/*email:cherami@163.net*/

import java.awt.image.*;

public class GrayModel extends ColorModel {

public static final int CS_MAX=0;

public static final int CS_FLOAT=1;

ColorModel sourceModel;

int modelStyle;

public GrayModel(ColorModel sourceModel) {

super(sourceModel.getPixelSize());

this.sourceModel=sourceModel;

modelStyle=0;

}

public GrayModel(ColorModel sourceModel,int style) {

super(sourceModel.getPixelSize());

this.sourceModel=sourceModel;

modelStyle=style;

}

public void setGrayStyle(int style) {

modelStyle=style;

}

protected int getGrayLevel(int pixel) {

if (modelStyle==CS_MAX) {

return Math.max(sourceModel.getRed(pixel),Math.max(sourceModel.getGreen(pixel),sourceModel.getBlue(pixel)));

}

else if (modelStyle==CS_FLOAT){

return (int)(sourceModel.getRed(pixel)*0.3+sourceModel.getGreen(pixel)*0.59+sourceModel.getBlue(pixel)*0.11);

}

else {

return 0;

}

}

public int getAlpha(int pixel) {

return sourceModel.getAlpha(pixel);

}

public int getRed(int pixel) {

return getGrayLevel(pixel);

}

public int getGreen(int pixel) {

return getGrayLevel(pixel);

}

public int getBlue(int pixel) {

return getGrayLevel(pixel);

}

public int getRGB(int pixel) {

int gray=getGrayLevel(pixel);

return (getAlpha(pixel)24)+(gray16)+(gray8)+gray;

}

}

如果你有自己的算法或者想取得特殊的效果,你可以修改類GrayModel的方法getGrayLevel()。

色彩變換

根據(jù)上面的原理,我們也可以實(shí)現(xiàn)色彩變換,這樣的效果就很多了。下面是一個(gè)反轉(zhuǎn)變換的例子:

/* ReverseColorModel.java*/

/*@author:cherami */

/*email:cherami@163.net*/

import java.awt.image.*;

public class ReverseColorModel extends ColorModel {

ColorModel sourceModel;

public ReverseColorModel(ColorModel sourceModel) {

super(sourceModel.getPixelSize());

this.sourceModel=sourceModel;

}

public int getAlpha(int pixel) {

return sourceModel.getAlpha(pixel);

}

public int getRed(int pixel) {

return ~sourceModel.getRed(pixel);

}

public int getGreen(int pixel) {

return ~sourceModel.getGreen(pixel);

}

public int getBlue(int pixel) {

return ~sourceModel.getBlue(pixel);

}

public int getRGB(int pixel) {

return (getAlpha(pixel)24)+(getRed(pixel)16)+(getGreen(pixel)8)+getBlue(pixel);

}

}

/* ReverseColorModel.java*/

/*@author:cherami */

/*email:cherami@163.net*/

import java.awt.image.*;

public class ReverseFilter extends RGBImageFilter {

public ReverseFilter() {

canFilterIndexColorModel=true;

}

public void setColorModel(ColorModel cm) {

substituteColorModel(cm,new ReverseColorModel(cm));

}

public int filterRGB(int x,int y,int pixel) {

return pixel;

}

}

要想取得自己的效果,需要修改ReverseColorModel.java中的三個(gè)方法,getRed、getGreen、getBlue。

下面是上面的效果的一個(gè)總的演示程序。

/*GrayImage.java*/

/*@author:cherami */

/*email:cherami@163.net*/

import java.awt.*;

import java.awt.image.*;

import javax.swing.*;

import java.awt.color.*;

public class GrayImage extends JFrame{

Image source,gray,gray3,clip,bigimg;

BufferedImage bimg,gray2;

GrayFilter filter,filter2;

ImageIcon ii;

ImageFilter cropFilter;

int iw,ih;

public GrayImage() {

ii=new ImageIcon(\"images/11.gif\");

source=ii.getImage();

iw=source.getWidth(this);

ih=source.getHeight(this);

filter=new GrayFilter();

filter2=new GrayFilter(GrayModel.CS_FLOAT);

gray=createImage(new FilteredImageSource(source.getSource(),filter));

gray3=createImage(new FilteredImageSource(source.getSource(),filter2));

cropFilter=new CropImageFilter(5,5,iw-5,ih-5);

clip=createImage(new FilteredImageSource(source.getSource(),cropFilter));

bigimg=source.getScaledInstance(iw*2,ih*2,Image.SCALE_DEFAULT);

MediaTracker mt=new MediaTracker(this);

mt.addImage(gray,0);

try {

mt.waitForAll();

} catch (Exception e) {

}


網(wǎng)站題目:java圖像處理代碼 java繪制圖片代碼
本文路徑:http://weahome.cn/article/hgjdjs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部