图像处理之二值腐蚀

简介: 图像处理之二值腐蚀 概述: 腐蚀是图像形态学的两个基本操作之一,另外一个是膨胀(Dilate)。二值图像上的腐蚀是腐蚀最典 型的运用,但是腐蚀操作同样可以运用于灰度图像。二值图像腐蚀操作最基本的效果是腐蚀图像 中前景色区域的边缘。

图像处理之二值腐蚀

概述:

腐蚀是图像形态学的两个基本操作之一,另外一个是膨胀(Dilate)。二值图像上的腐蚀是腐蚀最典

型的运用,但是腐蚀操作同样可以运用于灰度图像。二值图像腐蚀操作最基本的效果是腐蚀图像

中前景色区域的边缘。使得前景图像区域变小,前景图像内部的背景区域被放大。

 

基本原理:

腐蚀操作要求有待处理的2D图像F(x,y)以及操作数矩阵(类似卷积操作中的Kernel矩阵),常见的

为3X3的操作数矩阵。二值图像腐蚀操作的数学定义如下:

1.      假设X是二值图像中所有像素欧几里德坐标的集合,K为3X3的操作数矩阵

2.       Kx表示操作数处理X的结果,x表示起始像素点

3.      腐蚀操作K对X的所有像素点操作,Kx是X所有像素点的子集。

一个二值图像腐蚀的例子如下,操作数矩阵为3X3,起始点为中心像素点,前景像素表示为1,背

景像素表示为0.图示如下:


当操作数在像素矩阵上移动时,任何一个在操作数之下的输入像素为背景像素时,则设置中心像素

为背景像素0,否则中心像素[0,0]下的输入像素值不变。

 

三:程序效果


四:源代码

package com.gloomyfish.morphology;

import java.awt.Color;
import java.awt.image.BufferedImage;

public class ErosionFilter extends BinaryFilter {
	private Color backgroundColor;
	
	public ErosionFilter() {
		backgroundColor = Color.WHITE;
	}
	
	public Color getBackColor() {
		return backgroundColor;
	}

	public void setBackColor(Color forgeColor) {
		this.backgroundColor = forgeColor;
	}
	
	@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];
        int[] outPixels = new int[width*height];
        src = super.filter(src, null); // we need to create new one
        getRGB( src, 0, 0, width, height, inPixels );
        int index = 0, index1 = 0, newRow = 0, newCol = 0;
        int ta1 = 0, tr1 = 0, tg1 = 0, tb1 = 0;
        for(int row=0; row<height; row++) {
        	int ta = 0, tr = 0, tg = 0, tb = 0;
        	for(int col=0; col<width; col++) {
        		index = row * width + col;
        		ta = (inPixels[index] >> 24) & 0xff;
                tr = (inPixels[index] >> 16) & 0xff;
                tg = (inPixels[index] >> 8) & 0xff;
                tb = inPixels[index] & 0xff;
                boolean erosion = false;
                for(int offsetY=-1; offsetY<=1; offsetY++) {
                	for(int offsetX=-1; offsetX<=1; offsetX++) {
                		if(offsetY==0 && offsetX==0) {
                			continue;
                		}
                		newRow = row + offsetY;
                		newCol = col + offsetX;
                		if(newRow <0 || newRow >=height) {
                			newRow = 0;
                		}
                		if(newCol < 0 || newCol >=width) {
                			newCol = 0;
                		}
                		index1 = newRow * width + newCol;
                		ta1 = (inPixels[index1] >> 24) & 0xff;
                        tr1 = (inPixels[index1] >> 16) & 0xff;
                        tg1= (inPixels[index1] >> 8) & 0xff;
                        tb1 = inPixels[index1] & 0xff;
                        if(tr1 == backgroundColor.getRed() && tg1 == tb1) {
	                        erosion = true;
	                        break;
                        }
                	}
                	if(erosion){
                		break;
                	}
                }
                
                if(erosion) {
                	tr = tg = tb = backgroundColor.getRed();
                } else {
                	tr = tg = tb = 255 - backgroundColor.getRed();
                }
                outPixels[index] = (ta << 24) | (tr << 16) | (tg << 8) | tb;
        	}
        }
        setRGB( dest, 0, 0, width, height, outPixels );
        return dest;
	}


}
转载请注明出处

目录
相关文章
|
网络协议 应用服务中间件 Shell
21-Docker-常用命令详解-docker run
21-Docker-常用命令详解-docker run
|
存储 运维 监控
阿里云对象存储 OSS 发布全球第一可用性 SLA 背后的技术体系
2020年6月,阿里云对象存储 OSS 通过十年积累的技术红利,将可用性 SLA(Service Level Agreement) 提升 10 倍,做到了全球第一的核心竞争力,是其他的云厂家的 10~20 倍,如下图所示。
2107 0
阿里云对象存储 OSS 发布全球第一可用性 SLA 背后的技术体系
|
机器学习/深度学习 人工智能 算法
图解机器学习 | KNN算法及其应用
KNN算法(K近邻算法)是一种很朴实的机器学习方法,既可以做分类,也可以做回归。本文详细讲解KNN算法相关的知识,包括:核心思想、算法步骤、核心要素、缺点与改进等。
4006 1
图解机器学习 | KNN算法及其应用
|
11月前
|
搜索推荐 数据挖掘 API
探讨京东商品 API 接口:运用及收益
在数字化商业时代,京东商品 API 接口为企业和开发者提供了丰富的数据资源和应用机会。通过获取商品信息、价格、库存、用户评价等数据,API 接口助力电商平台建设、数据分析、移动应用开发和营销推广,提升商业价值、优化用户体验,并支持战略决策。遵守规范、保障数据安全是实现长期发展的关键。
260 2
|
负载均衡 算法 网络协议
gRPC Load Balancing
gRPC Load Balancing
194 5
|
存储 JavaScript 前端开发
JS的执行原理,一文了解Event Loop事件循环、微任务、宏任务
了解JavaScript的事件循环和任务队列对于处理异步任务至关重要。事件循环由主线程和任务队列组成,当主线程执行完同步任务后,会检查任务队列,按顺序执行宏任务和微任务。宏任务包括`setTimeout`等,微任务如`Promise`的回调。在实际开发中,事件循环保证了代码的非阻塞执行,提高了用户体验。例如,`setTimeout`的回调会在当前宏任务结束后,所有微任务执行完才会执行。理解这一机制对于解决面试中的异步问题非常有帮助。
228 0
JS的执行原理,一文了解Event Loop事件循环、微任务、宏任务
|
负载均衡 前端开发 应用服务中间件
前端开发者必备:Nginx入门实战宝典,从部署到优化一网打尽(1)
前端开发者必备:Nginx入门实战宝典,从部署到优化一网打尽
456 1
|
存储 SQL 关系型数据库
MySQL 优化 index merge(索引合并)引起的死锁分析(强烈推荐)
生产环境出现死锁流水,通过查看死锁日志,看到造成死锁的是两条一样的update语句(只有where条件中的值不同),如下:
|
存储 关系型数据库 MySQL
关于MySQL账号授权和回收的那点“破事”!
本篇带领对用户的授权和回收似懂非懂的朋友进行简单剖析,希望能起到抛砖引玉的效果。放弃前戏,直奔主题!!!
364 0
|
消息中间件 SQL 运维
如何设计实时数据平台(技术篇)
本文从技术角度入手,介绍RTDP的技术选型和相关组件,探讨适用不同应用场景的相关模式。