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

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

拉普拉斯濾波器產生奇怪的結果(Java)

拉普拉斯濾波器產生奇怪的結果(Java)

喵喔喔 2021-10-28 17:01:35
我正在嘗試應用[-1][-1][-1][-1][8][-1][-1][-1][-1]3*3 拉普拉斯濾波器到著名照片(png 擴展名)的灰度版本。我主要使用BufferedImage該類來處理圖像。這是拉普拉斯濾波器方法。private BufferedImage measureContrast(BufferedImage image) {        BufferedImage grayScale = createGrayscaleImage(image);        BufferedImage copy = copyImage(grayScale);        int width = image.getWidth();        int height = image.getHeight();        int sum=0;        int a;         //3*3 Laplacian filter (-1,-1,-1), (-1,8,-1), (-1,-1,-1)        for(int y=1;y<height-1;y++)            for(int x=1;x<width-1;x++) {                sum = (-1*(grayScale.getRGB(x-1, y-1)&0xff)) + (-1*(grayScale.getRGB(x, y-1)&0xff)) + (-1*(grayScale.getRGB(x+1, y-1)&0xff))                        + (-1*(grayScale.getRGB(x-1, y)&0xff)) + (8*(grayScale.getRGB(x,y)&0xff)) + (-1*(grayScale.getRGB(x+1, y)&0xff)) +                        (-1*(grayScale.getRGB(x-1, y+1)&0xff)) + (-1*(grayScale.getRGB(x, y+1)&0xff)) + (-1*(grayScale.getRGB(x+1, y+1)&0xff));                             a = ((grayScale.getRGB(x, y)>>24)&0xff);                copy.setRGB(x, y, ((a<<24)|(sum<<16)|(sum<<8)|(sum)));            }return copy;如果我運行該代碼,結果是這樣的這顯然是錯誤的。圖像中突然出現奇怪的粗線。我可以確保灰度版本是正確的,因為當我在應用過濾器之前運行以下代碼時,輸出會提供完美的灰度圖像。private BufferedImage measureContrast(BufferedImage image) {        BufferedImage grayScale = createGrayscaleImage(image);        BufferedImage copy = copyImage(grayScale); /*rest of the code is commented*/return copy;我一直試圖找到這個問題幾個小時,但我認為代碼沒有任何問題......任何見解將不勝感激。提前致謝!
查看完整描述

1 回答

?
慕森卡

TA貢獻1806條經驗 獲得超8個贊

private BufferedImage measureContrast(BufferedImage image) {

        BufferedImage grayScale = createGrayscaleImage(image);

        BufferedImage copy = copyImage(grayScale);


        int width = image.getWidth();

        int height = image.getHeight();

        int sum=0;

        int a;

         //3*3 Laplacian filter (-1,-1,-1), (-1,8,-1), (-1,-1,-1)

        for(int y=1;y<height-1;y++)

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

                sum = (-1*(grayScale.getRGB(x-1, y-1)&0xff)) + (-1*(grayScale.getRGB(x, y-1)&0xff)) + (-1*(grayScale.getRGB(x+1, y-1)&0xff))

                        + (-1*(grayScale.getRGB(x-1, y)&0xff)) + (8*(grayScale.getRGB(x,y)&0xff)) + (-1*(grayScale.getRGB(x+1, y)&0xff)) +

                        (-1*(grayScale.getRGB(x-1, y+1)&0xff)) + (-1*(grayScale.getRGB(x, y+1)&0xff)) + (-1*(grayScale.getRGB(x+1, y+1)&0xff));             

                a = ((grayScale.getRGB(x, y)>>24)&0xff);

                copy.setRGB(x, y, ((a<<24)|(sum<<16)|(sum<<8)|(sum)));

            }

return copy;

這個方法是錯誤的。我應該考慮 sum 何時為負值。所以我sum = (sum>0)?sum:0;在嵌套的 for 循環中添加,以確保在這些情況下像素值為 0。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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