2017-10-18 15:26:18 qq996980215 阅读数 173

图像锐化(拉普拉斯算子):

高斯模糊也是基于这种模板建立的:点击打开链接

下面是代码,注释中也有一些见解:

import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import java.io.File;
import java.io.IOException;
import java.util.Date;

import javax.imageio.ImageIO;


/**
 * javas算子,边缘提取
 * @author Bob
 * 2017年10月14日15:22:39
 */
public class EdgeExtraction {

	/**
	 * 获取图片的边界轮廓  
	 * @param image
	 * @return
	 */
    public static  BufferedImage getImageEdge(BufferedImage image) {  
        int imageWidth = image.getWidth();  
        int imageHeight = image.getHeight();  
        BufferedImage newPic = new BufferedImage(imageWidth, imageHeight,BufferedImage.TYPE_INT_RGB);  
        float[] elements = { 0.0f, -1.0f, 0.0f, 
        					-1.0f,  4.0f,-1.0f,
        					 0.0f, -1.0f, 0.0f };  
        Kernel kernel = new Kernel(3, 3, elements);  
        ConvolveOp cop = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);  
        cop.filter(image, newPic);  
        return newPic;  
    }  
    
    /**
     * 根据所给的算子做处理
     * 5.0以上都是不同程度的曝光过度
     * 图像锐化(拉普拉斯算子)是5.0,
     * 获取图片的边界轮廓  是 4.0,
     * @param image 图像
     * @param operator 算子
     * @return
     */
    public static  BufferedImage getImageEdge(BufferedImage image,float operator) {  
        int imageWidth = image.getWidth();  
        int imageHeight = image.getHeight();  
        BufferedImage newPic = new BufferedImage(imageWidth, imageHeight,BufferedImage.TYPE_INT_RGB);  
        //算子:图像锐化(拉普拉斯算子)中间是5.0,
        float[] elements = { 0.0f, -1.0f, 0.0f, 
        					-1.0f,  operator,-1.0f,
        					 0.0f, -1.0f, 0.0f };  
        Kernel kernel = new Kernel(3, 3, elements);  
        ConvolveOp cop = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);  
        cop.filter(image, newPic);  
        return newPic;  
    } 
    
      /**
     * 根据所给的算子模板做处理
     * @param image 图像
     * @param elements 算子模板
     * @return 
     * @throws Exception 
     */
    public static  BufferedImage getImageEdge(BufferedImage image, float[] elements) throws Exception {  
        int size=(int)Math.sqrt(elements.length);
        if(size*size!=elements.length){
        	throw new Exception("模板错误,模板长度必须为n*n(n为整形)");
        }
        int imageWidth = image.getWidth();  
        int imageHeight = image.getHeight();  
        BufferedImage newPic = new BufferedImage(imageWidth, imageHeight,BufferedImage.TYPE_INT_RGB);  
       
        Kernel kernel = new Kernel(size,size, elements);  
        ConvolveOp cop = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);  
        cop.filter(image, newPic);  
        return newPic;  
    } 
    /**
	 * @param args
	 */
	public static void main(String[] args) {
		Image a;
		try {
			a = ImageIO.read(new File("E:/ddd.png"));
			int width=a.getWidth(null);
			int height=a.getHeight(null);
			
			BufferedImage image=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
			Graphics g=image.getGraphics();
			g.drawImage(a, 0, 0, width, height, null);
			g.dispose();

			ImageIO.write(getImageEdge(image), "png", new File("e:/new_"+new Date().getTime()+".png"));

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	
	}
}


2018-08-11 11:56:00 dbsggal90047018 阅读数 25
Robert算子是一阶微分算子,比较简单,计算量小,对细节反应敏感。
Sobel算子是基于一阶导数的微分算子,其中引入了类似局部平均的运算,对于噪声有平滑作用,能很好地消除噪声的影响,所以计算量变大。
Prewitt算子和Sobel一样,图像中的点用Sobel的两个卷积核卷积,取最大值作为输出值。也增加了计算量。
Canny算子比较复杂,既要计算多个方向的梯度,又要记录方向和大小,然后又进行NMS非极大值抑制,大小阈值,反正很复杂就对了,自己百度一下。

转载于:https://www.cnblogs.com/eilearn/p/9459260.html

2019-02-27 23:33:14 rocketeerLi 阅读数 209

介绍

开始之前,有必要介绍一些基本的图像处理概念。

空域也叫空间域,是一种像素级上的操作,即直接对图像上的像素值进行增加或减少。对应的另一种图像处理的操作,是频域上的操作,频域可以由空域通过傅里叶变换转换过来,它更能体现图像中的能量特征。

处理图像的常用方法就是对图像进行滤波处理,即对图像的频率进行过滤,通常的滤波方法分为两种:高通滤波和低通滤波。顾名思义,高通滤波就是,减弱或阻隔低频信号,保留高频信号;而相应的,低通滤波是,减弱或阻隔高频信号,保留低频信号。虽然空域是图像在空间坐标的表示,但无论是空域还是频域,滤波都是处理图像的频率。

空域滤波按照过滤频率的高低,分为平滑(模糊)和锐化,平滑对应低通滤波;锐化对应高通滤波。也可以按照滤波的算法,分为线性滤波和非线性滤波,线性滤波就是滤波过程中,对像素的处理是线性的,如加减乘除等;而非线性滤波就是像素的处理是非线性的,如取最大值、取中值等。

空域滤波通常的方法是:取一个模板,然后平移这个模板,每次平移,都将进行一次计算,将计算的结果赋予给模板中间的像素,代替其原来的值,从而达到滤波的效果。空域中,不同的滤波方法就对应了不同的模板选取方式和模板中的计算方式。空域滤波器,可以看成一个函数,即算子,可以将一个像素值映射为另一个像素值。

下面介绍常用的空域中的图像处理算子。

低通滤波

邻域平均法

邻域平均法,顾名思义,就是邻域内各点灰度均值代替该点的像素值,也可以称为均值滤波。这是最简单,也是最常用的滤波方式。

公式如下:

g(x,y)=1M(i,j)Sf(i,j)g(x,y) = \frac{1}{M}\sum_{(i,j)\in S}f(i,j)

其中M为集合S内像素总数,S是 f(i, j) 像素的邻域[不含 f(i, j)像 素]的像素集合, g(i, j)为平滑后的图像。

均值滤波模板

在这上面进行扩展,可能会得到更有效的滤波器,例如增加阈值(取阈值的邻域平均法):某像素的灰度大于其邻近像素的 平均灰度,并超过阈值 T ,用均值替代。

公式如下:

取阈值的邻域平均法

效果:

均值滤波效果

此外,也可以更改模板中的权值,变为邻域加权平均,例如:

H=116[121242121]H = \frac1{16}\begin{bmatrix} 1 & 2 & 1 \\ 2 & 4 & 2 \\ 1 & 2 & 1\end{bmatrix}

注意:

为了保证邻域中的平均灰度在处理前后保持不变,权矩阵(模板)中各个元素的权值之和必须等于1。

中值滤波

这是一种非线性的处理技术,可用来抑制图像中的噪声而不使边缘模糊。

原理很简单:取一移动窗口,上下左右移动,用窗口内的像素(奇 数个)的中值代替窗口中心像素的灰度。

中值滤波例子1

中值滤波例子2

需要注意的是,中值滤波适合去除椒盐噪声,均值滤波适合去除高斯噪声。

高通滤波

高通滤波也就是锐化处理,通常是用于把图像变得更清晰,突出细节或是用于检测图像边缘。

锐化操作的模板矩阵通常带有负值,这样才能增大边缘之间的像素差,突出图像边缘特征。

下面用两个算子分别对同一张图片进行锐化处理:

在这里插入图片描述

Roberts算子

Roberts 算子是利用的局部像素差来进行边缘检测。是 2*2 窗口的,利用对角线相邻像素之差来进行检测。矩阵变化如下:

Roberts算子

效果:

Roberts算子效果

分别是蓝绿红三个通道的边缘和总的效果。

Sobel 算子

Sobel 算子是对阶跃边缘,对数字图像{f(i,j)}的每个像素,考察它上、下、左、右邻点 灰度的加权差。与之接近的邻点权大。

该算子是 3*3 窗口的,变换矩阵如下:

Sobel 算子

结果:

Sobel 算子效果

最后

还有很多其他算子,这里只是简单的介绍了四种。本文算是讲解了一个图像处理的基础知识,希望能够对大家有所帮助。

如有任何差错,请联系我改正,非常感谢。

2016-08-04 17:22:04 u013496193 阅读数 1674

在前几天的数字图像处理中,学习了几种图像处理算子和方法。对其进行比较以明白何时使用,以及怎样使用
资料主要来自于百度
来自百度文库,对几种算子比较
以上链接内容,不能完全理解暂时,对自己可以理解的部分总结一下
这里写图片描述
所以用这种方法做边缘检测
拉普拉斯检测模板的特点是各向同性,对孤立点及线端的检测效果好,但边缘方向信息丢失,对噪声敏感,整体检测效果不如梯度算子。因此,它很少直接用于边缘检测。但注意到与Sobel算子相比,对图像进行处理时,拉普拉斯算子能使噪声成分得到加强,对噪声更敏感。

2019-10-16 20:22:15 weixin_43262648 阅读数 578

数字图像处理——Sobel算子锐化、Prewitt算子锐化

一、Sobel算子锐化

%函数名称为Image_Sobel,输入参数Image,输出参数IMAGE
function [IMAGE] = Image_Sobel(Image)
%获取矩阵的行、列、波段数
[m,n,bands] = size(Image);
%定义模板大小,假设模板大小3×3
A = 1;
%定义Sobel算子x,y方向矩阵
Sobelx = [-1 -2 -1;0 0 0;1 2 1];
Sobely = [-1 0 1;-2 0 2;-1 0 1];
%初始化矩阵
Image1 = zeros(m,n,bands);
IMAGE = Image;
%Sobel算子
for k = 1:bands
    for i = 1+A:m-A
        for j = 1+A:n-A
            temp = Image(i-A:i+A,j-A:j+A,k);
           	Image1(i,j,k) = abs(sum(sum(Sobelx.*temp)))+abs(sum(sum(Sobely.*temp)));
        end
    end
end
IMAGE = Image + Image1;
%画图,左右分别表示原图和两幅处理后的图像
figure(1);
subplot(1,3,1);
imshow(uint8(Image));
title('原始图像');
subplot(1,3,2);
imshow(uint8(Image1));
title('边缘提取图像');
subplot(1,3,3);
imshow(uint8(IMAGE));
title('Sobel算子锐化后的图像')
end

二、prewitt算子锐化

%函数名称为Image_Prewitt,输入参数Image,输出参数IMAGE
function [IMAGE] = Image_Prewitt(Image)
%获取矩阵的行、列、波段数
[m,n,bands] = size(Image);
%定义模板大小,假设模板大小3×3
A = 1;
%定义Prewitt算子x,y方向矩阵
Prewittx = [-1 -2 -1;0 0 0;1 2 1];
Prewitty = [-1 0 1;-2 0 2;-1 0 1];
%初始化矩阵
Image1 = zeros(m,n,bands);
IMAGE = Image;
%Sobel算子
for k = 1:bands
    for i = 1+A:m-A
        for j = 1+A:n-A
            temp = Image(i-A:i+A,j-A:j+A,k);
           	Image1(i,j,k) = abs(sum(sum(Prewittx.*temp)))+abs(sum(sum(Prewitty.*temp)));
        end
    end
end
IMAGE = Image + Image1;
%画图,左中右分别表示原图和两幅处理后的图像
figure(1);
subplot(1,3,1);
imshow(uint8(Image));
title('原始图像');
subplot(1,3,2);
imshow(uint8(Image1));
title('边缘提取图像');
subplot(1,3,3);
imshow(uint8(IMAGE));
title('Prewitt锐化后的图像')
end

调用方法

Image = double(imread('当前目录下的图片名称.jpg'));
Sobel = Image_Sobel(Image);
Prewitt = Image_Prewitt(Image);

在这里插入图片描述

在这里插入图片描述

没有更多推荐了,返回首页