2016-12-28 82 views
0

我有一個256灰度級圖像,我想繪製只有#000(黑色)和#FFF(白色)像素(沒有別的)。要做到這一點如何使用抖動顯示只有黑色和白色像素的灰色圖像?

一種方法是使用抖動:https://upload.wikimedia.org/wikipedia/commons/6/6d/Dithering_example_red_blue.png

在這樣的算法,一種模糊的是通過在面積增加的像素(白色和黑色對我來說)的數量作出。

但是我不知道如何實現它:我如何確定代表所需灰度級的像素數? 你能寫一個這樣的算法(例如使用僞代碼,還是Java,Scala,C,C++)?

+0

看看這個http://stackoverflow.com/a/36820654/2521214只使用由2色黑白組成的調色板... – Spektre

回答

1

有很多不同的算法來創建抖動,我最喜歡的是隨機的,實現起來很簡單,它沒有重複模式,並且如果您每幀都重新抖動圖像,那麼隨着時間的推移,它的所有類型的平均值都會出現。

首先,一個重要且經常被忽略的部分是將256灰度級從sRGB(伽馬壓縮)值轉換爲線性(伽馬未壓縮)值,否則如維基百科的Dither文章中的示例中那樣,抖動圖像也會亮。要進行轉換,使用256條目查找表,並使線性值從0到4095.

然後簡單地使用linear_value < (rand()&4095) ? 0 : 255來設置抖動,這是通過將0和4095之間的隨機值與您的線性值,給你一個黑色或白色的像素。所以如果你的線性值是3072(非常淺的灰色),那麼4中的3次就會得到一個白色的像素,而如果你的值爲41(深灰色),你會在100次中得到99次黑色。

+0

祝賀您認識到從伽馬校正水平轉換的重要性,我無知這個問題多年。儘管隨機抖動很簡單,但速度可能會很慢(因爲隨機數的生成速度很慢)並且會產生難看的結果。我自己更喜歡弗洛伊德 - 斯坦伯格,或者更喜歡弗洛伊德 - 斯坦伯格。對於純隨機噪聲和高頻噪聲之間的差異,請參閱http://math.stackexchange.com/questions/2136099/restore-range-and-uniform-distribution-to-modified-random-numbers –

+0

馬克你不記得了嗎? ?幾乎4年前,你看到我的技術快速完成:D http://stackoverflow.com/questions/15793747/how-to-best-display-30-bpp-graphics-on-a-24-bpp-display/ 15793794#15793794 –

相關問題