图像处理------ 二值膨胀及应用

简介: <p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;"><strong>基本原理:</strong></p><p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-heig

基本原理:

膨胀是图像形态学的两个基本操作之一,另外一个是腐蚀操作。最典型的应用是在二值图像

中使用这两个基本操作,是很多识别技术中重要的中间处理步骤。在灰度图像中根据阈值同

样可以完成膨胀与腐蚀操作。对一幅二值图像f(x,y)完成膨胀操作,与对图像的卷积操作类

似,要有个操作数矩阵,最常见的为3X3的矩阵,与卷积操作不同的,是如果矩阵中的像素

点有任意一个点的值是前景色,则设置中心像素点为前景色,否则不变。

 

程序效果:(上为源图,下为膨胀以后效果)


程序原理:

首先把一幅彩色图像转换为灰度图像,转换方法参见这里

http://blog.csdn.net/jia20003/article/details/7392325

然根据像素平均值作为阈值,转换为二值图像,转换方法参见这里

http://blog.csdn.net/jia20003/article/details/7392325

最后在二值图像上使用膨胀操作,输出处理以后图像

源代码:

[java]  view plain copy
  1. package com.gloomyfish.morphology;  
  2.   
  3. import java.awt.Color;  
  4. import java.awt.image.BufferedImage;  
  5.   
  6. public class DilateFilter extends BinaryFilter {  
  7.       
  8.     public DilateFilter() {  
  9.         forgeColor = Color.WHITE;  
  10.     }  
  11.       
  12.     private Color forgeColor;  
  13.   
  14.     public Color getForgeColor() {  
  15.         return forgeColor;  
  16.     }  
  17.   
  18.     public void setForgeColor(Color forgeColor) {  
  19.         this.forgeColor = forgeColor;  
  20.     }  
  21.   
  22.     @Override  
  23.     public BufferedImage filter(BufferedImage src, BufferedImage dest) {  
  24.         int width = src.getWidth();  
  25.         int height = src.getHeight();  
  26.   
  27.         if ( dest == null )  
  28.             dest = createCompatibleDestImage( src, null );  
  29.   
  30.         int[] inPixels = new int[width*height];  
  31.         int[] outPixels = new int[width*height];  
  32.         src = super.filter(src, null); // we need to create new one  
  33.         getRGB( src, 00, width, height, inPixels );  
  34.         int index = 0, index1 = 0, newRow = 0, newCol = 0;  
  35.         int ta1 = 0, tr1 = 0, tg1 = 0, tb1 = 0;  
  36.         for(int row=0; row<height; row++) {  
  37.             int ta = 0, tr = 0, tg = 0, tb = 0;  
  38.             for(int col=0; col<width; col++) {  
  39.                 index = row * width + col;  
  40.                 ta = (inPixels[index] >> 24) & 0xff;  
  41.                 tr = (inPixels[index] >> 16) & 0xff;  
  42.                 tg = (inPixels[index] >> 8) & 0xff;  
  43.                 tb = inPixels[index] & 0xff;  
  44.                 boolean dilation = false;  
  45.                 for(int offsetY=-1; offsetY<=1; offsetY++) {  
  46.                     for(int offsetX=-1; offsetX<=1; offsetX++) {  
  47.                         if(offsetY==0 && offsetX==0) {  
  48.                             continue;  
  49.                         }  
  50.                         newRow = row + offsetY;  
  51.                         newCol = col + offsetX;  
  52.                         if(newRow <0 || newRow >=height) {  
  53.                             newRow = 0;  
  54.                         }  
  55.                         if(newCol < 0 || newCol >=width) {  
  56.                             newCol = 0;  
  57.                         }  
  58.                         index1 = newRow * width + newCol;  
  59.                         ta1 = (inPixels[index1] >> 24) & 0xff;  
  60.                         tr1 = (inPixels[index1] >> 16) & 0xff;  
  61.                         tg1= (inPixels[index1] >> 8) & 0xff;  
  62.                         tb1 = inPixels[index1] & 0xff;  
  63.                         if(tr1 == forgeColor.getRed() && tg1 == tb1) {  
  64.                             dilation = true;  
  65.                             break;  
  66.                         }  
  67.                     }  
  68.                     if(dilation){  
  69.                         break;  
  70.                     }  
  71.                 }  
  72.                   
  73.                 if(dilation) {  
  74.                     tr = tg = tb = forgeColor.getRed();  
  75.                 } else {  
  76.                     tr = tg = tb = 255 - forgeColor.getRed();  
  77.                 }  
  78.                 outPixels[index] = (ta << 24) | (tr << 16) | (tg << 8) | tb;  
  79.             }  
  80.         }  
  81.         setRGB( dest, 00, width, height, outPixels );  
  82.         return dest;  
  83.     }  
  84.   
  85. }  
其实,膨胀还可以被用来进行对二值图像完成边缘提取,其基本做法如下:

1. 对一副黑白的图像完成膨胀操作

2.将膨胀以后的图像与原来的图像在每个像素位上相减

3.显示相减以后的图像,即得到边缘。

相关文章
|
索引
Google Earth Engine(GEE)——提取指定矢量集合中的NDVI值并附时间属性
Google Earth Engine(GEE)——提取指定矢量集合中的NDVI值并附时间属性
380 2
|
10月前
|
机器学习/深度学习 存储 设计模式
特征时序化建模:基于特征缓慢变化维度历史追踪的机器学习模型性能优化方法
本文探讨了数据基础设施设计中常见的一个问题:数据仓库或数据湖仓中的表格缺乏构建高性能机器学习模型所需的历史记录,导致模型性能受限。为解决这一问题,文章介绍了缓慢变化维度(SCD)技术,特别是Type II类型的应用。通过SCD,可以有效追踪维度表的历史变更,确保模型训练数据包含完整的时序信息,从而提升预测准确性。文章还从数据工程师、数据科学家和产品经理的不同视角提供了实施建议,强调历史数据追踪对提升模型性能和业务洞察的重要性,并建议采用渐进式策略逐步引入SCD设计模式。
390 8
特征时序化建模:基于特征缓慢变化维度历史追踪的机器学习模型性能优化方法
|
传感器 5G UED
5G 标准化进程|带你读《5G空口特性与关键技术》之二
从 2016 年起,3GPP 启动了 R14 研究项,目标是在 2020 年实现 5G 的商业化部署。为此,3GPP 采取了按阶段定义规范的方式。第一阶段目标是R15,旨在完成规范 5G 的有限功能。第二阶段是 R16,旨在完成规范 IMT-2020 所定义的所有功能,将于 2019 年年底到 2020 年完成。
5G 标准化进程|带你读《5G空口特性与关键技术》之二
|
8月前
|
机器学习/深度学习
阿里妈妈首提AIGB并实现大规模商业化落地,将在NeurIPS 2024正式开源Benchmark
阿里妈妈提出AI-Generated Bidding(AIGB)新范式及DiffBid生成式竞价模型,突破传统基于强化学习的自动竞价方法局限。AIGB将自动竞价视为生成问题,通过捕捉复杂依赖关系,提升长期规划和随机环境中的稳定性和效果。DiffBid基于条件扩散建模,灵活生成满足特定目标的竞价轨迹,显著提升GMV和ROI。实验结果表明,DiffBid实现了2.81%的GMV增长和3.36%的ROI增长。然而,生成式建模的复杂性也带来了训练和调优的挑战。 论文链接:https://arxiv.org/abs/2405.16141
345 9
|
Web App开发 JavaScript 前端开发
技术心得:完全卸载node
技术心得:完全卸载node
1824 0
好看简单的Login登录界面,背景色带渐变
好看简单的Login登录界面,背景色带渐变
561 2
|
存储 数据管理 jenkins
自动化测试框架的搭建与实践
【8月更文挑战第3天】随着软件行业的迅猛发展,自动化测试已成为保证软件质量的重要手段。本文将介绍如何搭建一个高效的自动化测试框架,并通过实际代码示例展示其应用。我们将探讨框架设计的核心原则、工具选择和脚本编写的最佳实践,以及如何通过持续集成实现自动化测试流程的优化。
262 1
|
缓存 JavaScript 前端开发
Windows7压缩包安装node.js 报错提示windows Server 2012 R2 和安装React脚手架 最详细教程
对于Windows 7安装node.js 提示“This application is only supported on wWindows 8.1,windows Server 2012 R2, or higher.”类似这种情况的,该问题是因为node.js官方在 x12版本后就不支持win7系统了。
|
算法 云计算 索引
生成UUID和自定义UUID算法
生成UUID和自定义UUID算法
891 0
|
安全 算法 测试技术
什么是灰盒测试?
什么是灰盒测试?
1064 1