Opencv中开运算、闭运算、膨胀、腐蚀

该文详细介绍了图像处理中的开运算和闭运算过程,包括将图像转为灰度图,使用大津二值化分割前景和背景,以及腐蚀和膨胀操作。提供的Python代码展示了如何实现这两种运算,用于去除小像素块和连接中断的像素。
摘要由CSDN通过智能技术生成
开运算过程:
    1、将图像转化为灰度图。
    2、进行大津二值化,利用阈值将原图像分成前景,背景两个图象。
    3、开运算则是首先进行N次腐蚀,再进行N次膨胀。开运算可以用来去除仅存的小块像素。

闭运算过程:
    1、将图像转化为灰度图。
    2、进行大津二值化,利用阈值将原图像分成前景,背景两个图象。
    3、闭运算则是先进行N次膨胀,再进行N次腐蚀, 闭运算能够将中断的像素连接起来。

  (1)膨胀:如果结果大于255的话,将中心像素设为255 (2)腐蚀:结果小于255×4的话,将中心像素设为0。

实现代码:

import cv2
import numpy as np


class Open_Close:
    def __init__(self, img, Dila_times=1, th=128):
        self.image = img
        self.Dila_time = Dila_times
        self.th = th

    def BGR2GRAY(self, img):
        b = img[:, :, 0].copy()
        g = img[:, :, 1].copy()
        r = img[:, :, 2].copy()

        out = r * 0.2126 + g * 0.7152 + b * 0.0722
        out = out.astype(np.uint8)
        return out

    def otsu_binarization(self, img, th=128):
        H, W = img.shape
        out = img.copy()

        max_sigma = 0
        max_t = 0

        for _t in range(1, 255):
            v0 = out[out < _t]
            m0 = np.mean(v0) if len(v0) > 0 else 0
            w0 = len(v0) / (H * W)
            v1 = out[out >= _t]
            m1 = np.mean(v1) if len(v1) > 0 else 0
            w1 = len(v1) / (H * W)
            sigma = w0 * w1 * ((m0 - m1) ** 2)
            if sigma > max_sigma:
                max_sigma = sigma
                max_t = _t

        print(f'Threshold:{max_t}')
        th = max_t
        out[out < th] = 0
        out[out >= th] = 255
        return out


    #膨胀具体操作
    def Morphology_Erode(self, img, Dil_times):
        H, W = img.shape
        out = img.copy()

        MF = np.array(((0, 1, 0),
               (1, 0, 1),
               (0, 1, 0)), dtype=np.int32)

        for i in range(Dil_times):
            tmp = np.pad(out, (1, 1), 'edge')
            for y in range(1, H+1):
                for x in range(1, W+1):
                    if np.sum(MF * tmp[y-1:y+2, x-1:x+2]) > 255:
                        out[y-1, x-1] = 255

        return out


    #腐蚀具体操作
    def Morphology_Dilate(self, img, Dil_times):
        H, W = img.shape
        out = img.copy()

        MF = np.array(((0, 1, 0),
                       (1, 0, 1),
                       (0, 1, 0)), dtype=np.int32)

        for i in range(Dil_times):
            tmp = np.pad(out, (1, 1), 'edge')
            for y in range(1, H+1):
                for x in range(1, W+1):
                    if np.sum(MF * tmp[y-1:y+2, x-1:x+2]) < 255*4:
                        out[y-1, x-1] = 0
        return out


def open_c(img, s_times):

    open_r = Open_Close(img, s_times)
    img_gray = open_r.BGR2GRAY(image)
    out = open_r.otsu_binarization(img_gray)
    dilate_im = open_r.Morphology_Dilate(out, s_times)
    result_im = open_r.Morphology_Erode(dilate_im, s_times)
    cv2.imshow('Result_img', result_im)
    cv2.waitKey(0)
    cv2.destroyWindow()

def close_c(img, t_times):
    close_r = Open_Close(img, Dila_times=t_times)
    img_gray = close_r.BGR2GRAY(img)
    out = close_r.otsu_binarization(img_gray)
    erod = close_r.Morphology_Erode(out, t_times)
    result = close_r.Morphology_Dilate(erod, t_times)

    cv2.imshow('result_img', result)
    cv2.waitKey(0)
    cv2.destroyWindow()

if __name__ == "__main__":
    image = cv2.imread('img.png').astype(np.float32)
    times = 2
    #开运算
    open_c(image, times)

    #闭运算
    #close_c(image, times)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python OpenCV运算是一种图像处理操作,主要用于去除背景噪声并增强边界。它结合了膨胀腐蚀两个步骤,先对图像应用腐蚀操作以移除边缘的小细节或小孔洞,然后通过膨胀操作来恢复被腐蚀掉的部分。运算特别适用于处理边缘模糊或存在较小空洞的对象。 ### Python Opencv运算的步骤 #### 1. 腐蚀(Corrosion) - **作用**: 移除物体边缘的小点,缩小轮廓尺寸。 - **原理**: 对于每一个像素点,如果其周围的像素都满足某种条件,则保留该像素;否则将该像素设为背景色(如0)。这个过程可以去除小的孤立像素,减少噪音。 #### 2. 膨胀(Dilation) - **作用**: 将已腐蚀后的图像的边界向外扩展,增加边界大小。 - **原理**: 如果某像素的邻域内有非背景颜色的像素点存在,那么该像素将会被填充上颜色。这个步骤有助于填补由腐蚀导致的小缺口,并扩大物体的边界。 ### 应用场景 运算常用于图像处理阶段,尤其是针对那些形状复杂、边缘容易受到噪声影响的图像。例如,在分割文本行、检测特定形状的目标等任务非常有用。 ### 使用示例 在Python,使用OpenCV进行运算的基本步骤包括: ```python import cv2 import numpy as np # 加载图像 image = cv2.imread('input_image.jpg', 0) # 创建结构元素,通常使用矩形或圆形,大小可以根据需要调整 kernel_size = (5, 5) # 可以设置成任意大小 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, kernel_size) # 进行运算 closed = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel) cv2.imshow("Original Image", image) cv2.imshow("Closed Image", closed) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个例子,我们首先加载了一个灰度图像,接着创建了一个结构元素(通常是矩形),然后通过`cv2.morphologyEx()`函数执行运算。 ### 相关问题: 1. **运算开运算的区别是什么?** 开运算通常包含腐蚀后再膨胀的操作,适用于去除背景噪声同时平滑边界,而运算则相反,更适合填充值得填充的缺口和连接碎片。 2. **如何选择合适的结构元素尺寸和形状来进行运算?** 结构元素的尺寸应根据目标图像的特征和预期的结果来调整。一般地,较大的尺寸可以帮助消除更宽的间隙,而形状的选择(如圆形、方形、椭圆等)取决于需要优化的具体视觉效果。 3. **运算是否适合所有的图像处理任务?** 并非所有情况都适合使用运算。例如,对于一些不需要清除边界内部小区域的图像处理任务,使用运算可能会引入不必要的变化。因此,理解每个工具的应用场景至关重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值