C 處理數碼相片之馬賽克的實現

2022-03-08 01:45:09 字數 1321 閱讀 9934

應聽眾點播要求,今天講講馬賽克演算法的實現。老規矩,不求甚解,只許看不許問為什麼

很多處理的演算法從原理上講其實非常簡單,難點往往在如何去寫演算法實現它,更加難的就是如何去優化實現的演算法。雖說我一向認為程式設計師的效率比程式的效率更重要,但為了等處理一張自己拍攝的數碼**,溜出去買杯奶茶順便再買張彩票回來發現還沒算好,無論如何都是不能忍受的。

馬賽克演算法很簡單,說白了就是把一張分割成若干個val * val畫素的小區塊(可能在邊緣有零星的小塊,但不影響整體演算法),每個小區塊的顏色都是相同的。為了方便起見,我們不妨讓這個顏色就用該區域最左上角的那個點的顏色。當然還可以有其他方法,比如取區塊中間點的顏色,或區塊中隨機點的顏色作代表等等。

下面的示意圖就是取val=2的結果。

原影象素

abcdefg

hijklmn   

opqrstu   

vwxyz01   

2345678   

馬賽克處理後

aacceeg

aacceeg

ooqqssu

ooqqssu

2244668

原理就是那麼簡單。具體實現就看各人的思維習慣了。我的想法是:

當y(當前高度)是val的整數倍時:

掃瞄當前行中的每一點x,如果x也是val的整數倍,記錄下當前x,y的顏色值;如果x不是val的整數倍,則沿用最近一次被記錄的顏色值。

當y不是val的整數倍:

很簡單,直接複製上一行。

簡單的說就是以線帶面,最終實現讓大家都看不清楚

下面就是源**。寫演算法不是我的強項,不過偶爾勉為其難的寫個可以跑跑的不求甚解版還是可以做到的,不指望可以幫到你,只希望沒有誤導你。

public static bitmap kimosaic(bitmap b, int val)

int w = b.width;

int h = b.height;

int stdr, stdg, stdb;

stdr = 0;

stdg = 0;

stdb = 0;

bitmapdata srcdata = b.lockbits(new rectangle(0, 0, w, h), imagelockmode.readwrite, pixelformat.format24bpprgb);

unsafe

else

}else

p += 3;

} // end of x

p += srcdata.stride - w * 3;

} // end of y

b.unlockbits(srcdata);

}return b;

C 處理數碼相片之馬賽克的實現

應聽眾點播要求,今天講講馬賽克演算法的實現。老規矩,不求甚解,只許看不許問為什麼 很多處理的演算法從原理上講其實非常簡單,難點往往在如何去寫演算法實現它,更加難的就是如何去優化實現的演算法。雖說我一向認為程式設計師的效率比程式 的效率更重要,但為了等處理一張自己拍攝的數碼 溜出去買杯奶茶順便再買張彩...

數碼攝影入門之十 數碼相片後期處理

數碼攝影入門之十 數碼相片後期處理 有句話說拍得好不如ps的好 作為乙個真正想提高攝影技術的人,堅決不能為了炫耀而去ps出一些讓人驚嘆的相片來,只有自己拍的才有實際意義,也才能幫助你可以成為一名合格的攝影師.不要漠視後期處理,相片剛拍出來的總會有些遺憾,這時就需要你用相關軟體 photoshop等 ...

用C 讀取數碼相片的EXIF資訊(一)

現在的數位相機拍攝出來的 表面上看都是很普通的jpeg的,但通常還包含著諸如相片拍攝時使用的相機生產商 型號 光圈值 快門速度等各類附加資訊,這就是所謂的exif資訊。exif是一種影象檔案格式,只是檔案的字尾名還是沿用大家熟悉的jpg而已。掌握exif資訊對學習提高攝影技術很有幫助。c net作為...