亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我正在嘗試對正在處理的圖像進行馬賽克效果,但圖像保持不變?

我正在嘗試對正在處理的圖像進行馬賽克效果,但圖像保持不變?

瀟瀟雨雨 2021-12-10 15:00:46
我對處理很陌生。我正在嘗試創建一個對普通圖像應用馬賽克效果的程序。我想要實現的是為圖像創建過濾器大小的塊(例如 30 像素)并將其替換為該塊的 r、g、b 顏色的平均值這是我到目前為止所做的:class ME {  PImage image;  ME(String imagename) {    this.image = loadImage(imagename);  }  void display(int length, int height ) {    image.resize(length, height);    image(this.image, 0, 0);  }  void effect(int filterationSize) {  print("smth");    image.loadPixels();     float r, g, b;    for (int v = 0; v < (width*height ); v += filterationSize*width)     {      for (int h = 0; h < width; h+=filterationSize)      {        r = g = b = 0;        for (int bH = 0; bH<filterationSize; bH++)        {           for (int bV = 0; bV<filterationSize; bV++)        {        int p = v+h+bH+bV*width;        if ( p < width*width)          {            r += (red(this.image.pixels[p]) / (filterationSize*filterationSize));            g += (green(this.image.pixels[p]) / (filterationSize*filterationSize));            b += (blue(this.image.pixels[p]) / (filterationSize*filterationSize));          }        }        }         for (int blockH = 0; blockH<filterationSize; blockH++)      {        for (int blockV = 0; blockV<filterationSize; blockV++)        {          int p = v+h+blockH+blockV*width;          if ( p < width*width)          {            this.image.pixels[p] = color(r, g, b);          }        }      }      }    }    this.image.updatePixels();  }}這是我的主要課程:ME img ;void setup(){  size(500 ,500);  img = new ME("image.png");  img.display(width , height);}void draw(){   img.effect(30);}但最終圖像與一開始的圖像相同。
查看完整描述

1 回答

?
喵喔喔

TA貢獻1735條經驗 獲得超5個贊

將效果應用于圖像后,您錯過了顯示圖像:


void draw(){

    img.effect(30);

    img.display(width , height);

}

但可能您想在圖像加載后應用一次效果:


    ME img;


void setup(){

   size(500 ,500);

   img = new ME("image.png");

   img.display(width , height);

   img.effect(30);

}


void draw(){

    img.effect(30);

    img.display(width, height);

}

此外,您可以改進effect算法。


計算瓷磚的數量,但請注意,行或列中的最后一個瓷磚可能會被剪裁:


int tiles_x = width / filterationSize;

if ( width % filterationSize > 0 ) 

    tiles_x += 1;


int tiles_y = height / filterationSize;

if ( height % filterationSize > 0 ) 

    tiles_y += 1;

計算開始結束坐標和循環內圖塊的“大小”:


int start_x = tile_x*filterationSize;

int start_y = tile_y*filterationSize;

int end_x   = min(start_x+filterationSize, width); 

int end_y   = min(start_y+filterationSize, height);

int size    = (end_x-start_x) * (end_y-start_y); 

現在很容易計算一個瓦片的像素的平均值。完整的算法可能如下所示:


void effect(int filterationSize) {

    image.loadPixels(); 


    int tiles_x = width / filterationSize;

    if ( width % filterationSize > 0 ) 

        tiles_x += 1;

    int tiles_y = height / filterationSize;

    if ( height % filterationSize > 0 ) 

        tiles_y += 1;


    print( tiles_x, tiles_y );

    for ( int tile_y = 0; tile_y < tiles_x; tile_y ++ ) {

        for ( int tile_x = 0; tile_x < tiles_y; tile_x ++ ) {


            int start_x = tile_x*filterationSize;

            int start_y = tile_y*filterationSize;

            int end_x   = min(start_x+filterationSize, width); 

            int end_y   = min(start_y+filterationSize, height);

            int size    = (end_x-start_x) * (end_y-start_y);


            float r = 0, g = 0, b = 0;

            for (int by = start_y; by < end_y; by++ ) {

                for (int bx = start_x; bx < end_x; bx++ ) {

                    int p = by * width + bx;

                    r += red(this.image.pixels[p])   / size;

                    g += green(this.image.pixels[p]) / size;

                    b += blue(this.image.pixels[p])  / size;

                }

            }


            for (int by = start_y; by < end_y; by++ ) {

                for (int bx = start_x; bx < end_x; bx++ ) {

                    int p = by * width + bx;

                    this.image.pixels[p] = color(r, g, b);

                }

            }

        }

    }

    this.image.updatePixels();

}

查看應用于 256*256 圖像和 32 塊長度的效果:

http://img1.sycdn.imooc.com//61b2fb3c000170c802510252.jpghttp://img1.sycdn.imooc.com//61b2fb430001648c02510255.jpg

查看完整回答
反對 回復 2021-12-10
  • 1 回答
  • 0 關注
  • 134 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號