`
itace
  • 浏览: 178586 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

图像边缘检测算子

 
阅读更多

 

package com.chipmunk.util;

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

import javax.imageio.ImageIO;

/**
 * 算子
 * 
 * sobel,prewitt,roberts,laplace,canny
 * 均有卷积因子,小矩阵
 * 
 * @author Administrator
 *
 */
public class OperatorUtil {

	/**
	 * 索贝尔算子(Sobel operator)
	 * 
	 * 横向矩阵 卷积因子
	 * Gx=  -1  0 +1
	 * 		-2  0 +2    *   A  
	 * 		-1  0 +1
	 * 
	 * 纵向矩阵 卷积因子
	 * Gy=  +1 +2 +1
	 * 		 0  0  0    *   A
	 * 		-1 -2 -1
	 * 		
	 * A= a  b  c
	 *    d  e  f
	 *    g  h  i
	 * 
	 * 		
	 * G=Math.hypot(Gx,Gy);
	 * 为了简便,用|G|=|Gx|+|Gy|
	 * 
	 * @param data
	 * @param w
	 * @param h
	 * @return
	 */
	public static int[] sobel(int[]data,int w,int h){
		
		int[] d= new int[w*h];  
		for(int j=1;j<h-1;j++){  
			for(int i=1;i<w-1;i++){  
				int s1 = data[i-1+(j+1)*w]+2*data[i+(j+1)*w]+data[i+1+(j+1)*w]-data[i-1+(j-1)*w]-2*data[i+(j-1)*w]-data[i+1+(j-1)*w];  
				int s2 = data[i+1+(j-1)*w]+2*data[i+1+(j)*w]+data[i+1+(j+1)*w]-data[i-1+(j-1)*w]-2*data[i-1+(j)*w]-data[i-1+(j+1)*w];  
				int s  = Math.abs(s1)+Math.abs(s2);  
				if(s < 0)  
					s =0;  
				if(s > 255)  
					s = 255;  
				d[i + j * w] = s;  
			}      
		}  
		return d;
	}  
	/**
	 * 普利维特算子(Prewitt operate)
	 * 
	 * 横向矩阵 卷积因子
	 * Gx=  -1  0 +1
	 * 		-1  0 +1    *   A  
	 * 		-1  0 +1
	 * 
	 * 纵向矩阵 卷积因子
	 * Gy=  +1 +1 +1
	 * 		 0  0  0    *   A
	 * 		-1 -1 -1
	 * 	
	 * @param data
	 * @param w
	 * @param h
	 * @return
	 */
	public static int[] prewitt(int[]data,int w,int h){
		
        int[] d= new int[w*h];  
        for(int j=1;j<h-1;j++){  
            for(int i=1;i<w-1;i++){  
                int s1 = data[i-1+(j+1)*w]+data[i+(j+1)*w]+data[i+1+(j+1)*w]-data[i-1+(j-1)*w]-data[i+(j-1)*w]-data[i+1+(j-1)*w];  
                int s2 = data[i+1+(j-1)*w]+data[i+1+(j)*w]+data[i+1+(j+1)*w]-data[i-1+(j-1)*w]-data[i-1+(j)*w]-data[i-1+(j+1)*w];  
                int s  = Math.abs(s1)+Math.abs(s2);  
                if(s < 0)  
                    s =0;  
                if(s > 255)  
                    s = 255;  
                d[i + j * w] = s;   
            }      
        }  
        return d;
    } 
	/**
	 * 罗伯茨交叉边缘检测(Roberts Cross operator)
	 *
	 * 横向矩阵 卷积因子
	 * Gx=  +1  0 	 *   A 
	 * 		 0 -1     
	 * 		
	 * 
	 * 纵向矩阵 卷积因子
	 * Gy=  0  +1 
	 * 		-1  0    *   A
	 * 	
	 * A = x,y     x+1,y     =      a   b
	 *     x,y+1   x+1,y+1          c   d
	 *     
	 * Gx=  a+b-c-d
	 * Gy= -a-b+c+d    	
	 * 
	 * @param data
	 * @param w
	 * @param h
	 * @return
	 */
	public static int[] roberts(int[]data,int w,int h){
		
		int[] d= new int[w*h];  
		for(int j=0;j<h-1;j++){  
			for(int i=0;i<w-1;i++){  
				int s1 = data[i+j*w]+data[i+1+j*w]-data[i+(j+1)*w]-data[i+1+(j+1)*w];  
				int s2 = data[i+(j+1)*w]+data[i+1+(j+1)*w]-data[i+j*w]-data[i+1+j*w];  
				int s  = Math.abs(s1)+Math.abs(s2);  
				if(s < 0)  
					s =0;  
				if(s > 255)  
					s = 255;  
				d[i + j * w] = s;  
			}      
		}  
		return d;
	}  
	/**
	 * 拉普拉斯算子laplace
	 * 
	 * 离散拉普拉斯算子的模板:
	 * 0   1   0
	 * 1   4   1
	 * 0   1   0
	 * 
	 * 其扩展模板: 
	 * 1   1   1
	 * 1   8   1
	 * 1   1   1
	 * @param data
	 * @param w
	 * @param h
	 * @return
	 */
	//TODO 未完待续
	public static int[] laplace(int[]data,int w,int h){
		
		int[] d= new int[w*h];  
	    for(int j=1;j<h-1;j++){  
            for(int i=1;i<w-1;i++){  
            	// 1	1	1
            	// 6	6	6
            	// 1	1	1
            	int s1 = data[i-1+(j-1)*w]
            	         +data[i+(j-1)*w]
            	         +data[i+1+(j-1)*w]
    	                 +6*data[i-1+j*w]
		            	 +6*data[i+j*w]
		            	 +6*data[i+1+j*w]
		            	 +data[i-1+(j+1)*w]
		            	 +data[i+(j+1)*w]
		            	 +data[i+1+(j+1)*w];
				int s  = Math.abs(s1);  
				if(s < 0)  
					s =0;  
				if(s > 255)  
					s = 255;  
				d[i + j * w] = s;   
            }      
        }
		return d;
	}  
	/**
	 * 各种边界算子
	 * @param src
	 * @param dest
	 * @param type:1-sobel,2-prewitt,3-roberts,4-laplace
	 */
	public static void suanzis(File src,File dest,int type){
		try {
			BufferedImage bi = ImageIO.read(src);
			int w = bi.getWidth();
			int h = bi.getHeight();
			int[]data = ImageUtil.getImageBW(src);
			int[]d = null;
			if (type==1) {
				d = sobel(data, w, h);
			}else if (type==2) {
				d = prewitt(data, w, h);
			}else if (type==3) {
				d = roberts(data, w, h);
			}else if (type==4) {
				d = laplace(data, w, h);
			}
			ImageUtil.writeImageRGB(d, dest, w, h);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 

分享到:
评论

相关推荐

    图像边缘检测,图像边缘检测算子中抗噪性能最好的是,matlab

    总结来说,基于蚁群聚类算法的图像边缘检测是一种具有优秀抗噪性能的边缘检测方法,它利用生物智能解决了传统边缘检测算子在噪声环境下的局限性。在MATLAB中实现这一算法,可以方便地进行实验和优化,为图像处理领域...

    图像边缘检测算子.docx

    图像边缘检测算子 图像边缘检测是数字图像处理中的一项重要内容,它的主要作用是从图像中提取有用的信息,例如边缘、角点、线段等特征。边缘检测算子是图像处理中的一种常用技术,用于检测图像中的边缘信息。 在...

    laplacian图像边缘检测算子 matlab程序

    laplacian图像边缘检测算子 matlab程序

    基于MATLAB的遥感图像边缘检测算子的实验比较分析.pdf

    遥感图像边缘检测是数字图像处理的重要组成部分,边缘检测算子对于图像识别和分析至关重要。边缘指的是图像中灰度发生剧烈变化的像素集合,是图像识别的基础特征。边缘的灰度变化一般可以使用导数来描述和检测,常见...

    图像边缘检测算子.pdf

    【图像边缘检测算子】 在数字图像处理领域,边缘检测是一项关键的技术,它用于识别图像中的边界,这些边界通常对应于图像中物体的轮廓。边缘检测对于后续的图像分析、特征提取、目标识别等任务至关重要。本文将深入...

    论文研究-数字图像边缘检测算子的性能比较分析 .pdf

    边缘检测算子作为检测图像边缘的一类算法,在计算机视觉和模式识别等领域发挥着重要作用。边缘检测技术的不断进步,催生了众多新理论和方法,其中包括边缘算子法、模板匹配法、曲线拟合法、门限法、数学形态法、模糊...

    Matalb图像分割边缘检测算子比较

    Matlab作为强大的数值计算和图像处理工具,提供了多种边缘检测算子供用户选择。本篇将详细介绍几种常用的Matlab边缘检测算法,并通过实际操作和比较来探讨它们的特点和适用场景。 1. **Sobel算子**:Sobel算子是一...

    边缘检测算子分割

    在给定的标题“边缘检测算子分割”中,提到的是一系列不同的边缘检测算子,包括Canny、Prewitt、Roberts、Sobel和Laplacian,这些都是在图像分析中广泛使用的微分算子。 1. **Canny算子**:Canny算法是一种多级边缘...

    数字图像处理边缘检测算子 (2).pdf

    本文简要介绍了各种经典图像边缘检测算子的基本原理,并对其性能进行了比较和评价。 一、经典边缘检测算子简介 边缘检测算子是图像处理中最基本的技术之一,它可以将图像分割成不同的区域,检测出图像中的边缘信息...

    基于MATLAB数字图像边缘检测算子的研究

    图像边缘检测是数字图像处理中的关键步骤,它旨在识别和定位图像中不同区域之间的边界,从而提取出图像的主要特征。MATLAB作为一个强大的数学和计算平台,提供了多种内置的边缘检测算子,使得研究人员和工程师能够...

    图像边缘检测算子,

    图像边缘检测是计算机视觉和图像处理中的关键技术,用于识别图像中的边界或变化点。这些边界通常代表了图像中不同物体的分界线,因此在目标识别、图像分割、模式识别等领域有着广泛的应用。本主题主要关注几种常见的...

    基于MATLAB的遥感图像边缘检测算子的实验比较分析.rar

    基于MATLAB的遥感图像边缘检测算子的实验比较分析

    数字图像处理中几种边缘检测算子的比较

    "数字图像处理中几种边缘检测算子的比较" 数字图像处理中,边缘检测是一种基本的图像处理技术,旨在标识数字图像中亮度变化明显的点。边缘检测的目的是在图像中检测出明显的亮度变化点,以便更好地理解图像的结构和...

    经典边缘检测算子对比.pdf

    本文简要介绍了各种经典图像边缘检测算子的基本原理,并通过 Matlab 仿真实验结果表明各种算子的特点及对噪声的敏感度,为学习和寻找更好的边缘检测方法提供参考价值。 一、经典边缘检测算子的基本原理 图像边缘...

    图像边缘检测,图像边缘检测算子中抗噪性能最好的是,matlab源码.zip

    本文将深入探讨图像边缘检测的基本概念、常用算子以及MATLAB实现,特别是那些具有优异抗噪性能的算法。 图像边缘是图像中亮度变化显著的地方,通常代表了物体的轮廓或形状。在数字图像处理中,边缘检测是通过计算...

    基于MATLAB的数字图像边缘检测算子的实验对比研究.pdf

    本文主要对几种常见的边缘检测算子进行了理论分析和实验对比研究,选取了如Roberts算子、Prewitt算子和Sobel算子等具有代表性的算法进行详细介绍和分析。 边缘检测算子的核心思想是基于图像灰度值的变化,灰度的...

    边缘检测 Roberts边缘算子 Sobel边缘检测算子 Prewitt边缘检测算子 Kirsch边缘检测算子 拉普拉斯算子 高斯拉普拉斯算子.rar

    1. **Roberts边缘算子**:Roberts边缘检测算子是一种简单的二阶导数算子,它利用45度和135度方向的差分来检测图像边缘。这种算子对噪声敏感,但在处理低对比度图像时效果较好。 2. **Sobel边缘检测算子**:Sobel...

Global site tag (gtag.js) - Google Analytics