python实现图像膨胀和腐蚀算法

如果您觉得本文不错!记得点赞哦!



一. 图像形态学简介:

经验之谈:形态学操作一般作用于二值图像,来连接相邻的元素(膨胀)或分离成独立的元素(侵蚀)。腐蚀和膨胀是针对图片中的白色(即前景)部分!



二. 图像形态学操作 膨胀和腐蚀的算法:

膨胀算法:

对于待操作的像素 f(x,y),不论 f(x,y-1) 、f(x,y+1) 、f(x-1,y) 、f(x+1,y) 哪一个为255,则 f(x,y)=255。

膨胀操作 ↑

换句话说:将待操作的图像像素与以下  4-近邻矩阵 相乘,结果大于255的话,将中心像素设为255。

膨胀:待操作像素 * 上面矩阵 > =255,f(x,y) = 255。 ↑

 腐蚀算法:

对于待操作的像素 f(x,y),只有 f(x,y-1) 、f(x,y+1) 、f(x-1,y) 、f(x+1,y) 都为255,则 f(x,y)=255。

换句话说:将待操作的图像像素与以下  4-近邻矩阵 相乘,结果小于255*4的话,将中心像素设为0。

腐蚀:待操作像素 * 上面矩阵 < 255*4,f(x,y) = 0 。↑



三. python实现图像膨胀和腐蚀

  1 # Writer : [email protected]
  2 # Date   : 2020.3.21
  3 import cv2
  4 import numpy as np
  5 import matplotlib.pyplot as plt
  6
  7 # Gray scale
  8 def BGR2GRAY(img):
  9     b = img[:, :, 0].copy()
 10     g = img[:, :, 1].copy()
 11     r = img[:, :, 2].copy()
 12
 13     # Gray scale
 14     out = 0.2126 * r + 0.7152 * g + 0.0722 * b
 15     out = out.astype(np.uint8)
 16
 17     return out
 18
 19 # Otsu Binalization
 20 def otsu_binarization(img, th=128):
 21     H, W = img.shape
 22     out = img.copy()
 23
 24     max_sigma = 0
 25     max_t = 0
 26
 27     # determine threshold
 28     for _t in range(1, 255):
 29         v0 = out[np.where(out < _t)]
 30         m0 = np.mean(v0) if len(v0) > 0 else 0.
 31         w0 = len(v0) / (H * W)
 32         v1 = out[np.where(out >= _t)]
 33         m1 = np.mean(v1) if len(v1) > 0 else 0.
 34         w1 = len(v1) / (H * W)
 35         sigma = w0 * w1 * ((m0 - m1) ** 2)
 36         if sigma > max_sigma:
 37             max_sigma = sigma
 38             max_t = _t
 39
 40     # Binarization
 41     print("threshold >>", max_t)
 42     th = max_t
 43     out[out < th] = 0
 44     out[out >= th] = 255
 45
 46     return out
 47
 48
 49 # Morphology Dilate
 50 def Morphology_Dilate(img, Dil_time=1):
 51     H, W = img.shape
 52
 53     # kernel
 54     MF = np.array(((0, 1, 0),
 55                 (1, 0, 1),
 56                 (0, 1, 0)), dtype=np.int)
 57
 58     # each dilate time
 59     out = img.copy()
 60     for i in range(Dil_time):
 61         tmp = np.pad(out, (1, 1), ‘edge‘)
 62         for y in range(1, H):
 63             for x in range(1, W):
 64                 if np.sum(MF * tmp[y-1:y+2, x-1:x+2]) >= 255:
 65                     out[y, x] = 255
 66
 67     return out
 68
 69
 70 # Morphology Erode
 71 def Morphology_Erode(img, Erode_time=1):
 72     H, W = img.shape
 73     out = img.copy()
 74
 75     # kernel
 76     MF = np.array(((0, 1, 0),
 77                 (1, 0, 1),
 78                 (0, 1, 0)), dtype=np.int)
 79
 80     # each erode
 81     for i in range(Erode_time):
 82         tmp = np.pad(out, (1, 1), ‘edge‘)
 83         # erode
 84         for y in range(1, H):
 85             for x in range(1, W):
 86                 if np.sum(MF * tmp[y-1:y+2, x-1:x+2]) < 255*4:
 87                     out[y, x] = 0
 88
 89     return out
 90
 91
 92 # Read image
 93 img = cv2.imread("../paojie.jpg").astype(np.float32)
 94
 95 # Grayscale
 96 gray = BGR2GRAY(img)
 97
 98 # Otsu‘s binarization
 99 otsu = otsu_binarization(gray)
100
101 # Morphology - dilate
102 erode_result = Morphology_Erode(otsu, Erode_time=2)
103 dilate_result = Morphology_Dilate(otsu,Dil_time=2)
104
105 # Save result
106 cv2.imwrite("Black_and_white.jpg",otsu)
107 cv2.imshow("Black_and_white",otsu)
108 cv2.imwrite("erode_result.jpg", erode_result)
109 cv2.imshow("erode_result", erode_result)
110 cv2.imwrite("dilate_result.jpg", dilate_result)
111 cv2.imshow("dilate_result",dilate_result)
112 cv2.waitKey(0)
113 cv2.destroyAllWindows()


四. 实验结果:

二值图像(左),膨胀图像(中),侵蚀图像(右) ↑



五. 参考内容:

① https://www.jianshu.com/p/ba2cec49c981

② https://www.cnblogs.com/yibeimingyue/p/10856439.html



六. 版权声明:

未经作者允许,请勿随意转载抄袭,抄袭情节严重者,作者将考虑追究其法律责任,创作不易,感谢您的理解和配合!

原文地址:https://www.cnblogs.com/wojianxin/p/12542004.html

时间: 2024-11-05 17:33:57

python实现图像膨胀和腐蚀算法的相关文章

Atitit 图像处理—图像形态学(膨胀与腐蚀)

Atitit 图像处理-图像形态学(膨胀与腐蚀) 1.1. 膨胀与腐蚀1 1.2. 图像处理之二值膨胀及应用2 1.3. 测试原理,可以给一个5*5pic,测试膨胀算法5 1.4. Photoshop里面的处理5 1.5. 类库的处理,好像没找到jhlabs,6 1.6. Attilax 源码6 1.1. 膨胀与腐蚀 说概念可能很难解释,我们来看图,首先是原图: 膨胀以后会变成这样: 腐蚀以后则会变成这样: 看起来可能有些莫名其妙,明明是膨胀,为什么字反而变细了,而明明是腐蚀,为什么字反而变粗了

图像处理——灰度化、二值化、膨胀算法、腐蚀算法以及开运算和闭运算

一.RGB RGB色彩模式使用RGB模型为图像中每个像素的RGB分量分配一个0~255范围内的强度值.RGB图像仅仅使用三种颜色,R(red).G(green).B(blue),就能够使它们依照不同的比例混合,在屏幕上呈现16777216(256 * 256 * 256)种颜色. 在电脑中,RGB的所谓"多少"就是指亮度,并使用整数来表示.通常情况下,RGB各有256级亮度,用数字表示为从0.1.2...直到255. 二.ARGB 一种色彩模式,也就是RGB色彩模式附加上Alpha(透

图像的膨胀与腐蚀、细化

原理:在特殊领域运算形式--结构元素(Sturcture Element),在每个像素位置上与二值图像对应的区域进行特定的逻辑运算.运算结构是输出图像的相应像素.运算效果取决于结构元素大小内容以及逻辑运算性质. 结构元素:膨胀和腐蚀操作的最基本组成部分,用于测试输出图像,通常要比待处理的图像小还很多.二维平面结构元素由一个数值为0或1的矩阵组成.结构元素的原点指定了图像中需要处理的像素范围,结构元素中数值为1的点决定结构元素的邻域像素在进行膨胀或腐蚀操作时是否需要参与计算. 先来定义一些基本符号

图像的膨胀与腐蚀——OpenCV与C++的具体实现

目录 1. 膨胀与腐蚀的原理 2. 膨胀的具体实现 1) OpenCV实现 2) C/C++实现 3) 验证与结果 3. 腐蚀的具体实现 1. 膨胀与腐蚀的原理 膨胀与腐蚀是数学形态学在图像处理中最基础的操作.在笔者之前的文章<图像的卷积(滤波)运算(一)--图像梯度>.<图像的卷积(滤波)运算(二)--高斯滤波>具体介绍了图像卷积\滤波的具体的概念与操作,图像的膨胀与腐蚀其实也是一种类似的卷积操作.其卷积操作非常简单,对于图像的每个像素,取其一定的邻域,计算最大值/最小值作为新图

OpenCV学习 7:图像形态学:腐蚀、膨胀

原创文章,欢迎转载,转载请注明出处 首先什么是图像形态学?额,这个抄下百度到的答案.基本思想:    用具有一定形态的结构元素去度量和提取图像中的对应形状已达到对图像分析和识别的目的,形态学图像处理表现为一种领域运算方式(这个和前面的模糊运算是一样的运算方式),效果取决于结构元素(就是前面smooth里面的核)的大小,内容以及逻辑运算的性质.看了这些定义是不是很晕,对很晕...我比较关心的是它的用途和怎么计算.    用途是:简化图像数据,保持他们基本的形状特性,并出去不相干的结构.    基本

图像形态学操作—腐蚀膨胀深入

这里我们主要想讲解冈萨雷斯的数字图像处理这本书上膨胀腐蚀的定义及用opencv实现的结果,然后对比它们之间的差异. 一:opencv实现 在这之前可以看我的另外一篇blog:http://blog.csdn.net/lu597203933/article/details/17184439 膨胀: 案例代码: int main() { int a[8][8] = { {0,0,0,0,0,0,0,0}, {0,0,5,1,0,0,1,1}, {0,1,0,1,0,1,0,0}, {0,1,1,2,

Python实现图像直方图均衡化算法

title: "Python实现图像直方图均衡化算法" date: 2018-06-12T17:10:48+08:00 tags: [""] categories: ["python"] 效果图 代码 #!/usr/bin/env python3 # coding=utf-8 import matplotlib.image as mpimg from matplotlib import pyplot as plt import sys impor

膨胀和腐蚀 - 解决图像缺陷问题

目录 腐蚀 膨胀 闭运算 && 开运算 腐蚀 故名思义就是将图片向内进行收缩. 图1 腐蚀示意图 ??设经过背景减后的图像为 B,经过腐蚀运算处理后的图像为 P,用 S 表示所用 3R圆(为进化计算可由采用3x3的矩形来代替) 的结构元素,计算公式如下: \[ P=B\Theta S= \{x,y | S_{x,y}\subseteq B\} \] ??这里 \(S_{x,y}\) 表示将结构元素的原点移动到点 (x, y) 处. 腐蚀运算的具体过程如下: ??选定结构元素 S 的起点,以

paper 76:膨胀、腐蚀、开、闭运算——数字图像处理中的形态学

膨胀.腐蚀.开.闭运算是数学形态学最基本的变换.本文主要针对二值图像的形态学膨胀:把二值图像各1像素连接成分的边界扩大一层(填充边缘或0像素内部的孔):腐蚀:把二值图像各1像素连接成分的边界点去掉从而缩小一层(可提取骨干信息,去掉毛刺,去掉孤立的0像素):开:先腐蚀再膨胀,可以去掉目标外的孤立点闭:先膨胀再腐蚀,可以去掉目标内的孔.以下参考论文:<数学形态学在图像处理中的应用> 二值形态学        数学形态学中二值图像的形态变换是一种针对集合的处理过程.其形态算子的实质是表达物体或形状的