java影象處理--形態學填充處理imfill
阿新 • • 發佈:2019-02-01
在網上搜了好多都沒有特別使用的,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);
}
}
實現如下圖:
將較小的蟲洞填充
原創程式碼,歡迎指點