图像处理-形态学(腐蚀与膨胀,开操作与闭操作)

问题1:请将图像中的小星系去除,只保留最大的星云。

图像腐蚀是数字图像处理中的一种基本操作,其原理是将图像中的物体边缘腐蚀掉,使得物体变小或消失,同时保留背景信息,以便更好地分离和提取图像中的物体。

图像腐蚀的具体实现是利用一个叫结构元素的模板,将其与图像中的像素进行比较,如果模板中的所有像素都与图像中的对应像素匹配,则该像素被保留,否则被腐蚀掉。这种比较过程可以使用逻辑运算来实现,通常采用的是 AND 运算。具体来说,结构元素中的每个像素都与图像中的像素进行 AND 运算,如果所有结果都为1,则保留该像素,否则该像素被腐蚀掉。

图像腐蚀可以应用于很多领域,如图像处理、计算机视觉、图像分析等。它可以用于去除图像中的噪声、分离图像中的前景和背景、提取图像中的边缘等。

import cv2
import numpy as np


def erode_image(img, kernel_size):
   # 获取图像尺寸
   img_height, img_width = img.shape
   # 计算腐蚀核的中心位置
   kernel_center_h = kernel_center_w = kernel_size // 2
   # 创建一个新的图像
   eroded_img = np.zeros((img_height, img_width), dtype=np.uint8)
   # 对图像进行遍历
   for i in range(kernel_center_h, img_height - kernel_center_h):
       for j in range(kernel_center_w, img_width - kernel_center_w):
           # 提取与腐蚀核重叠的部分
           img_roi = img[i - kernel_center_h:i + kernel_center_h + 1,
                     j - kernel_center_w:j + kernel_center_w + 1]
           # 进行腐蚀操作,取ROI内的最小值
           eroded_img[i, j] = np.min(img_roi)
   return eroded_img


# 读取图像
img = cv2.imread("star.png", cv2.IMREAD_GRAYSCALE)

# 对图像进行腐蚀操作
img2 = erode_image(img, 3)

# 显示原始图像和腐蚀后的图像
cv2.imshow("Original Image", img)
cv2.imshow("Eroded Image", img2)
cv2.imwrite('1.png', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

 结果图:

 可以看到经过3*3卷积核灰度腐蚀后的图像,小星系基本都被去除了,只保留了最大的星云。

问题2:请对下图分别进行开操作和闭操作,并对处理结果进行分析。

图像开闭运算是数学形态学中常用的图像处理操作,通常用于去除噪声、连接断开的线条、消除细节等。图像开操作通常用于去除小物体和填充物体内部空洞,图像闭操作通常用于填充物体的空洞和连接断开的线条。

图像开操作的原理是将图像与一个结构元素进行腐蚀操作,然后再进行膨胀操作。腐蚀操作会使物体边缘变得更加锐利,从而去除较小的物体和细节。膨胀操作会将结构元素覆盖的区域变为白色,使物体边缘变得更加平滑,从而填补物体内部的空洞。

图像闭操作的原理是将图像与一个结构元素进行膨胀操作,然后再进行腐蚀操作。膨胀操作会使物体的边缘扩张,从而填补物体内部的空洞和连接断开的线条。腐蚀操作会使物体边缘变得更加锐利,从而去除较小的物体和细节。

图像开闭操作的效果受结构元素的形状和大小影响,结构元素的形状和大小应该根据实际需求进行选择。

 

import cv2
import numpy as np


def Dilate_or_Erode(img, kernel_size, type):
   # 获取图像尺寸
   img_height, img_width = img.shape
   # 计算腐蚀核的中心位置
   kernel_center_h = kernel_center_w = kernel_size // 2
   # 创建一个新的图像
   img2 = np.zeros((img_height, img_width), dtype=np.uint8)
   # 对图像进行遍历
   for i in range(kernel_center_h, img_height - kernel_center_h):
       for j in range(kernel_center_w, img_width - kernel_center_w):
           # 提取与腐蚀核重叠的部分
           img_roi = img[i - kernel_center_h:i + kernel_center_h + 1,
                     j - kernel_center_w:j + kernel_center_w + 1]
           if type == 'Dilate':
               # 进行膨胀操作,取ROI内的最大值
               img2[i, j] = np.max(img_roi)
           elif type == 'Erode':
               # 进行腐蚀操作,取ROI内的最小值
               img2[i, j] = np.min(img_roi)
           else:
               print("error!")
               return
   return img2


# Morphology Closing
def Morphology_Closing(img, kernel_size):
   out = Dilate_or_Erode(img, kernel_size, type='Dilate')
   out = Dilate_or_Erode(out, kernel_size, type='Erode')
   return out


# Opening morphology
def Morphology_Opening(img, kernel_size):
   out = Dilate_or_Erode(img, kernel_size, type='Erode')
   out = Dilate_or_Erode(out, kernel_size, type='Dilate')
   return out


# 读取图像
img2 = cv2.imread('blb1.jpg', cv2.IMREAD_GRAYSCALE)
# 进行开运算操作
opening = Morphology_Opening(img2, 5)
# 进行闭运算操作
closing = Morphology_Closing(img2, 5)
# 显示结果
cv2.imshow('Opening', opening)
cv2.imshow('Closing', closing)
cv2.imwrite('2_Opening.png', opening)
cv2.imwrite('2_Closing.png', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果图:

开操作:

 

闭操作:

可以看到,开操作可以平滑图像物体的边缘,从而使物体的形状更加清晰和准确,物体的边缘变得更加锐利;而图像进行闭运算后,可以填补物体内部的空洞和连接断开的线条,从而使物体的形状更加完整和连续。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

F0reverBound

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值