利用区域生长法绘画一个白色矩形框

首先简单介绍一下数字图像处理中的区域生长法

在应用区域生长法时,需要考虑三个问题

1、种子像素是哪些或者哪一个

选择和确定一组能够代表种子像素的一般原则为:
(1)接近聚类中心的像素可以作为种子像素

(2)红外图像目标检测中最亮的像素可作为种子像素

(3)按照位置要求确定种子像素

(4)根据某种经验确定种子像素

2、确定在生长过程中能将相邻像素合并进来的相似性准则

确定相似性准则的准则主要有:

(1)考虑自己所要处理的问题所需,例如需要找到灰度性差不多的点,那就应该考虑待检测的点与已合并区域中的所有像素点的平均值是否满足某种相似性准则,通俗地讲,也就是说灰度值大小满不满足你想并进来的条件。

(2)尺寸要求、形状要求,图像颜色等

3、确定终止生长过程的条件或规则

(1)一般的停止生长准则是生长过程进行到没有满足生长准则的像素为止

当然也可以加入你所处理的问题所需要的要求来确定,例如形状要求、尺寸要求等

本文利用区域生长法绘画一个白色矩形框,其实质相当于是给一个图像,设定一个形状限制条件,的像素点进行灰度值赋值。

用刚刚介绍的考虑三个问题来解释一下:
种子像素:自己手动选取的图像中的一个点

相似性准则:满足图像形状即可

终止生长的条件:汇完白色矩形框即可

举出这个例子初衷是让读者对于区域生长有一个较为初步的认识

下面是实现绘画白色矩形框的程序,其中定义的区域生长的类方法的还有很大的可优化空间,就交给读者去优化了。

import numpy as np
import cv2


class RegionGrow:
    """区域生长成一条矩形框"""
    def __init__(self, x, y, width, length, img_height, img_width):
        """区域生长的点以及图像的高宽设置"""
        self.x = x
        self.y = y
        #   自定义的线宽
        self.width = width
        #   自定义的线长
        self.length = length
        #    生成一个黑色图像
        self.img = np.zeros([img_height, img_width])
        self.img_height = img_height
        self.img_width = img_width

    def grow_length(self):
        print(self.img.shape)
        self.label = 255
        length_source = 1#  矩形框长度初值
        for length in range(1, self.length):
            """将矩形的左边长和上边长绘画出来"""
            self.line_new_x = self.x + length_source
            self.line_new_y = self.y + length_source
            if self.line_new_x < self.img_height - 20 and self.line_new_y < self.img_width - 20:
                #   在x方向上进行区域生长
                self.img[self.line_new_x, self.y] = self.label
                #   在y方向上进行区域生长
                self.img[self.x, self.line_new_y] = self.label
                length_source += 1
        print(f"{self.line_new_x}-{self.y},{self.x}-{self.line_new_y} ")
        length_source_1 = 1
        for length_1 in range(1, self.length):
            """将举行的下边长以及右边长进行绘画出来"""
            self.line_new_y1 = self.y + length_source_1
            self.line_new_x1 = self.x + length_source_1
            if self.line_new_x1 < self.img_height - 20 and self.line_new_y1 < self.img_width - 20:
                #   在区域增长到一个新的起点之后,按照新的起点继续,此为矩形的下边长
                self.img[self.line_new_x, self.line_new_y1] = self.label
                #   在区域增长到一个新的起点之后,按照新的起点继续,此为矩形的右边长
                self.img[self.line_new_x1, self.line_new_y] = self.label
                length_source_1 += 1
        print(f"{self.line_new_x}--{self.line_new_y1}, {self.line_new_x1}--{self.line_new_y}")

    def grow_width(self):
        """将绘画的矩形线宽度从1像素变为self.width大小的像素"""
        i = 1
        for length in range(self.x, self.line_new_x + 1):
            width = self.width
            i = 1
            while width > 0:
                """将矩形的左边长和上边长绘画出来"""
                """将矩形的左边长加宽"""
                self.img[length, self.y + i] = self.label
                """将矩形的上边长加宽"""
                self.img[self.x + i, length] = self.label
                """将矩形的右边长加宽"""
                self.img[length, self.line_new_y - i] = self.label
                """将矩形的下边长加宽"""
                self.img[self.line_new_x - i, length] = self.label
                i += 1
                width -= 1


img_region_grow = RegionGrow(20, 20, 50, 760, 800, 800)
img_region_grow.grow_length()
img_region_grow.grow_width()
cv2.imshow('img_region_grow', img_region_grow.img)
cv2.imwrite('C:\\Users\\yu\\Desktop\\picture_csdn\\img_region_a_line.png', img_region_grow.img)
cv2.waitKey(0)
cv2.destroyAllWindows()

实现的效果图如下:

程序中新建的一个黑色图像

 

 

区域生长完成后的图像

猜你喜欢

转载自blog.csdn.net/kuwola/article/details/122630424