中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java圖像處理之倒角距離變換的示例分析

發布時間:2021-08-23 10:53:50 來源:億速云 閱讀:197 作者:小新 欄目:編程語言

這篇文章主要介紹了java圖像處理之倒角距離變換的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

圖像處理中的倒角距離變換(Chamfer Distance Transform)在對象匹配識別中經常用到,算法基本上是基于3x3的窗口來生成每個像素的距離值,分為兩步完成距離變換,第一步從左上角開始,從左向右、從上到下移動窗口掃描每個像素,檢測在中心像素x的周圍0、1、2、3四個像素,保存最小距離與位置作為結果,圖示如下:

java圖像處理之倒角距離變換的示例分析

第二步從底向上、從右向左,對每個像素,檢測相鄰像素4、5、6、7保存最小距離與位置作為結果,如圖示所:

java圖像處理之倒角距離變換的示例分析

完成這兩步以后,得到的結果輸出即為倒角距離變換的結果。完整的圖像倒角距離變換代碼實現可以分為如下幾步:

1.對像素數組進行初始化,所有背景顏色像素點初始距離為無窮大,前景像素點距離為0

2.開始倒角距離變換中的第一步,并保存結果

3.基于第一步結果完成倒角距離變換中的第二步

4.根據距離變換結果顯示所有不同灰度值,形成圖像

最終結果顯示如下(左邊表示原圖、右邊表示CDT之后結果)

java圖像處理之倒角距離變換的示例分析

完整的二值圖像倒角距離變換的源代碼如下:

package com.gloomyfish.image.transform; 
 
import java.awt.Color; 
import java.awt.image.BufferedImage; 
import java.util.Arrays; 
 
import com.gloomyfish.filter.study.AbstractBufferedImageOp; 
 
public class CDTFilter extends AbstractBufferedImageOp { 
  private float[] dis; // nn-distances 
  private int[] pos; // nn-positions, 32 bit index 
  private Color bakcgroundColor; 
   
  public CDTFilter(Color bgColor) 
  { 
    this.bakcgroundColor = bgColor; 
  } 
 
  @Override 
  public BufferedImage filter(BufferedImage src, BufferedImage dest) { 
    int width = src.getWidth(); 
    int height = src.getHeight(); 
 
    if (dest == null) 
      dest = createCompatibleDestImage(src, null); 
 
    int[] inPixels = new int[width * height]; 
    pos = new int[width * height]; 
    dis = new float[width * height]; 
    src.getRGB(0, 0, width, height, inPixels, 0, width); 
    // 隨機生成距離變換點 
    int index = 0; 
    Arrays.fill(dis, Float.MAX_VALUE); 
    int numOfFC = 0; 
    for (int row = 0; row < height; row++) { 
      for (int col = 0; col < width; col++) { 
        index = row * width + col; 
        if (inPixels[index] != bakcgroundColor.getRGB()) { 
          dis[index] = 0; 
          pos[index] = index; 
          numOfFC++; 
        } 
      } 
    } 
    final float d1 = 1; 
    final float d2 = (float) Math.sqrt(d1 * d1 + d1 * d1); 
    System.out.println(numOfFC); 
    float nd, nd_tmp; 
    int i, in, cols, rows, nearestPixel; 
 
    // 1 2 3 
    // 0 i 4 
    // 7 6 5 
    // first pass: forward -> L->R, T-B 
    for (rows = 1; rows < height - 1; rows++) { 
      for (cols = 1; cols < width - 1; cols++) { 
        i = rows * width + cols; 
 
        nd = dis[i]; 
        nearestPixel = pos[i]; 
        if (nd != 0) { // skip background pixels 
          in = i; 
 
          in += -1; // 0 
          if ((nd_tmp = d1 + dis[in]) < nd) { 
            nd = nd_tmp; 
            nearestPixel = pos[in]; 
          } 
 
          in += -width; // 1 
          if ((nd_tmp = d2 + dis[in]) < nd) { 
            nd = nd_tmp; 
            nearestPixel = pos[in]; 
          } 
 
          in += +1; // 2 
          if ((nd_tmp = d1 + dis[in]) < nd) { 
            nd = nd_tmp; 
            nearestPixel = pos[in]; 
          } 
 
          in += +1; // 3 
          if ((nd_tmp = d2 + dis[in]) < nd) { 
            nd = nd_tmp; 
            nearestPixel = pos[in]; 
          } 
 
          dis[i] = nd; 
          pos[i] = nearestPixel; 
        } 
      } 
    } 
 
    // second pass: backwards -> R->L, B-T 
    // exactly same as first pass, just in the reverse direction 
    for (rows = height - 2; rows >= 1; rows--) { 
      for (cols = width - 2; cols >= 1; cols--) { 
        i = rows * width + cols; 
 
        nd = dis[i]; 
        nearestPixel = pos[i]; 
        if (nd != 0) { 
          in = i; 
 
          in += +1; // 4 
          if ((nd_tmp = d1 + dis[in]) < nd) { 
            nd = nd_tmp; 
            nearestPixel = pos[in]; 
          } 
 
          in += +width; // 5 
          if ((nd_tmp = d2 + dis[in]) < nd) { 
            nd = nd_tmp; 
            nearestPixel = pos[in]; 
          } 
 
          in += -1; // 6 
          if ((nd_tmp = d1 + dis[in]) < nd) { 
            nd = nd_tmp; 
            nearestPixel = pos[in]; 
          } 
 
          in += -1; // 7 
          if ((nd_tmp = d2 + dis[in]) < nd) { 
            nd = nd_tmp; 
            nearestPixel = pos[in]; 
          } 
 
          dis[i] = nd; 
          pos[i] = nearestPixel; 
 
        } 
      } 
    } 
 
    for (int row = 0; row < height; row++) { 
      for (int col = 0; col < width; col++) { 
        index = row * width + col; 
        if (Float.MAX_VALUE != dis[index]) { 
          int gray = clamp((int) (dis[index])); 
          inPixels[index] = (255 << 24) | (gray << 16) | (gray << 8) 
              | gray; 
        } 
      } 
    } 
    setRGB(dest, 0, 0, width, height, inPixels); 
    return dest; 
  } 
 
  private int clamp(int i) { 
    return i > 255 ? 255 : (i < 0 ? 0 : i); 
  } 
 
}

感謝你能夠認真閱讀完這篇文章,希望小編分享的“java圖像處理之倒角距離變換的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

垫江县| 青海省| 肥西县| 疏勒县| 江华| 浪卡子县| 泉州市| 柘荣县| 和平区| 柞水县| 山东省| 曲麻莱县| 巴南区| 故城县| 兴义市| 连城县| 宽城| 泰来县| 始兴县| 图们市| 富蕴县| 丰镇市| 安福县| 雷波县| 托克逊县| 游戏| 湟中县| 平武县| 岳阳市| 忻城县| 博爱县| 文成县| 保定市| 昭通市| 华阴市| 剑河县| 穆棱市| 谢通门县| 若尔盖县| 陆河县| 宜兰市|