2014-02-26 79 views
1

我試圖實現弗洛伊德算法,但它似乎不起作用。使用弗洛伊德 - 斯坦伯格抖動不工作

我用僞代碼算法從維基百科 不弗洛伊德http://img15.hostingpics.net/pics/298623Capturedcran20140226165024.png

與弗洛伊德http://img15.hostingpics.net/pics/968250Capturedcran20140226165035.png

這是我的代碼:

template<> 
Image<ubyte>* Image<ubyte>::floydSteinberg() const 
{ 
    Image<ubyte>* tmp = new Image<ubyte>(this->width, this->height); 

    for (int i=0; i < width*height; i++) 
      tmp->array[i]= this->array[i]; 


    for (int y = 0; y< this->height; y++){ 

     for (int x = 1; x<this->width; x++){ 

      ubyte oldpixel = tmp->pixel(x, y); 
      ubyte newpixel = (oldpixel > 128) ? 255 : 0; 
      tmp->pixel(x,y) = newpixel; 
      ubyte propagationErreur = oldpixel - newpixel; 

      tmp->pixel(x+1,y) =tmp->pixel(x+1,y) + 7.0/16 * propagationErreur; 
      tmp->pixel(x-1,y+1) = tmp->pixel(x-1,y+1) + 3.0/16 * propagationErreur ; 
      tmp->pixel(x,y+1) = tmp->pixel(x,y+1) + 5.0/16 * propagationErreur ; 
      tmp->pixel(x+1,y+1) = tmp->pixel(x+1,y+1) + 1.0/16 * propagationErreur ; 

     } 
    } 


    return tmp; 
} 
+0

Floyd肯定使用[Steinberg的圖書館](http://www.2038bug.com/ptrans/ptrans.c.html)。 –

+0

這樣做沒有圖書館是不可能的? –

+0

@Pépito爲什麼你認爲它不起作用? – anatolyg

回答

3
ubyte newpixel = (oldpixel > 128) ? 0 : 255; 

必須

ubyte newpixel = (oldpixel > 128) ? 255 : 0; 

另一個可能的問題:我建議propagationErreur應該簽署類型

+0

是的,我已經dit它。我想做一個測試,忘記更新它。 這是結果:http://zupimages.net/up/14/09/cz98.png –

+0

@Pépito它似乎是圖片cz98.png - 負面形象,在更正之前,以255:0,不是嗎?並看到我的新編輯 – MBo

+0

謝謝。它似乎是簽名式的幫助。所以它看起來像http://zupimages.net/up/14/09/sct8.png –