java 圖像特效之彩色邊緣

閱讀本系列,請先看前言!謝謝

之前有文章寫到過邊緣檢測

sobel算子和Prewitt算子拉普拉斯算子
那是對灰度圖像進行處理的,如果我們對彩色圖像的RGB三個通道都坐邊緣檢測並將結果合起來會怎樣呢?
沒錯!就會出現彩色邊緣~
說來就來,爲了實現這個功能,我修改了Image類,添加了RGB三通道的保存,如下:
<span style="font-size:14px;"><span style="font-size:10px;">public class Image{
	
	public int h;
	public int w;
	public int[] data;
	public int[] red;
	public int[] green;
	public int[] blue;
	public boolean gray;
}</span></span>

彩色邊緣代碼:
<span style="font-size:14px;"><span style="font-size:10px;">public Image filter() {
		
		if(this.img.gray)
			return this.img;  // Grayscale images can not be processed
		
		for (int j = 1; j < this.img.h-1; j++) {
            for (int i = 1; i < this.img.w-1; i++) {
            	int w = this.img.w;
            	int r1 = this.img.red[i-1+(j+1)*w]+2*this.img.red[i+(j+1)*w]+this.img.red[i+1+(j+1)*w]-this.img.red[i-1+(j-1)*w]-2*this.img.red[i+(j-1)*w]-this.img.red[i+1+(j-1)*w];
		        int r2 = this.img.red[i+1+(j-1)*w]+2*this.img.red[i+1+(j)*w]+this.img.red[i+1+(j+1)*w]-this.img.red[i-1+(j-1)*w]-2*this.img.red[i-1+(j)*w]-this.img.red[i-1+(j+1)*w];
		        int g1 = this.img.green[i-1+(j+1)*w]+2*this.img.green[i+(j+1)*w]+this.img.green[i+1+(j+1)*w]-this.img.green[i-1+(j-1)*w]-2*this.img.green[i+(j-1)*w]-this.img.green[i+1+(j-1)*w];
		        int g2 = this.img.green[i+1+(j-1)*w]+2*this.img.green[i+1+(j)*w]+this.img.green[i+1+(j+1)*w]-this.img.green[i-1+(j-1)*w]-2*this.img.green[i-1+(j)*w]-this.img.green[i-1+(j+1)*w];
		        int b1 = this.img.blue[i-1+(j+1)*w]+2*this.img.blue[i+(j+1)*w]+this.img.blue[i+1+(j+1)*w]-this.img.blue[i-1+(j-1)*w]-2*this.img.blue[i+(j-1)*w]-this.img.blue[i+1+(j-1)*w];
		        int b2 = this.img.blue[i+1+(j-1)*w]+2*this.img.blue[i+1+(j)*w]+this.img.blue[i+1+(j+1)*w]-this.img.blue[i-1+(j-1)*w]-2*this.img.blue[i-1+(j)*w]-this.img.blue[i-1+(j+1)*w];
		        
                int tr = (Math.abs(r1)+Math.abs(r2));
                int tg = (Math.abs(g1)+Math.abs(g2));
                int tb = (Math.abs(b1)+Math.abs(b2));
                
                this.img.data[i + j * this.img.w] = (255 << 24) | (math.st(tr) << 16) | (math.st(tg) << 8) | math.st(tb);              
            }
        }
		this.img.gray = false;
		return this.img;
	}</span></span>

運行結果:





以上

發佈了53 篇原創文章 · 獲贊 32 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章