1. 程式人生 > >java影象處理--形態學填充處理imfill

java影象處理--形態學填充處理imfill

在網上搜了好多都沒有特別使用的,java實現imfill的演算法,有一些關於opencv的,但是作為一枚初學菜鳥,還是很難搞懂的,直入主題吧

演算法設計思路

(1)輸入一張二值影象(很多看似黑白的影象並不完全是黑白的,當然在此做了處理)
(2)將影象RGB值儲存到一個二維陣列中,例如 imageColor[i][j] = 0xFFFF00FF;
(3)對得到的二維陣列進行處理,邏輯如下:
根據畫素之間關係可以將一個畫素理解為被八個畫素包裹的畫素,即matlab中imFill的所謂八連通處理,和四連通處理,此處為四連通處理
對某一個畫素的上下左右四個方向進行遍歷,遍歷的長度是有一定要求的,根據需求而定,如果四個方向在遍歷區域內都有白色出現,則將其賦值為白色,從而實現對影象的簡單填充處理,
(4)建立影象緩衝區BufferedImage,儲存相應畫素矩陣

原始碼如下:

imfill實現類:

package java二值影象填充;

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class imfll {

    BufferedImage grayImage;
    BufferedImage imfillImage;

    public imfll(String imFill,Graphics graphics) {
        // TODO Auto-generated constructor stub
int[][] imageColor ; //imageColor = new int[][]; try { grayImage = ImageIO.read(new File(imFill)); //建立緩衝區 imfillImage = new BufferedImage(grayImage.getWidth(), grayImage.getHeight(), grayImage.getType()); //畫素矩陣
imageColor = new int[grayImage.getWidth()][grayImage.getHeight()]; for (int i = 0; i < grayImage.getWidth(); i++) { for (int j = 0; j < grayImage.getHeight(); j++) { imageColor[i][j] = grayImage.getRGB(i , j); } } imageColor = imfillImage(15,imageColor); //將畫素矩陣賦值到緩衝區相應位置 for (int i = 0; i < grayImage.getWidth(); i++) { for (int j = 0; j < grayImage.getHeight(); j++) { imfillImage.setRGB(i, j, imageColor[i][j]); } } graphics.drawImage(grayImage, 0, 0, 380, 400,null); graphics.drawImage(imfillImage,400,0, 380,400,null); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /* * 核心演算法 * * 思路: 根據四連通啟發到 * * 判斷該畫素上下左右四個方向,一定距離上是否都存在白色區域 * 如果四個方向都存在,返回此處為白色 */ private int[][] imfillImage(int distance, int[][] imageColor) { // TODO Auto-generated method stub int[][] newImageColor; newImageColor = imageColor; int counter; for (int i = distance; i < imageColor.length - distance; i++) { for (int j = distance; j < imageColor[1].length - distance; j++) { counter = 0; //上 for (int k1 = 0; k1 < distance; k1++) { if (imageColor[i-k1][j] > 0xffaa0000) { counter++; break; } } //左 for (int k1 = 0; k1 < distance; k1++) { if (imageColor[i][j-k1] > 0xffaa0000) { counter++; break; } } //下 for (int k1 = 0; k1 < distance; k1++) { if (imageColor[i+k1][j] > 0xffaa0000) { counter++; break; } } //右 for (int k1 = 0; k1 < distance; k1++) { if (imageColor[i][j+k1] > 0xffaa0000) { counter++; break; } } if (counter == 4) newImageColor[i][j] = 0xffffffff; }//for (int j = 0; j < imageColor[1].length; j++) }//for (int i = 0; i < imageColor.length; i++) return newImageColor; } }

測試類:

package java二值影象填充;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class test extends JPanel{

    public static void main(String[] args) {

        JFrame mFrame = new JFrame();
        mFrame.setVisible(true);
        mFrame.setSize(800, 500);
        mFrame.add(new test());

    }
    @Override   
    public void paint(Graphics g) {
        // TODO Auto-generated method stub
        super.paint(g);     
        imfll mImfll = new imfll("color1.jpg", g);
    }
}

實現如下圖:
將較小的蟲洞填充
這裡寫圖片描述
原創程式碼,歡迎指點