【问题标题】:Artificially increasing the region of interest of an image人为地增加图像的感兴趣区域
【发布时间】:2020-01-30 20:16:55
【问题描述】:

我正在解决一个图像分割问题。为了提高模型的准确性,我遇到了以下预处理步骤-

首先,ROI外边界的像素集合是de 终止的,即在 ROI 之外并且是邻居的像素 (使用四邻域)到其中的像素。然后,每个像素值 这个集合的平均值被它的邻居的平均值替换(这个 时间使用八邻域)在 ROI 内。最后,投资回报率是 通过包含这组更改的像素来扩展。这个过程是 重复,可以看作是人为地增加了投资回报率。

应用以下步骤后的图像如下 -

我正在应用上述步骤的图像如下 -

在问here 的问题时,我得到了最初的方法来获取图像周围的黑色区域并将其用作 alpha 蒙版。
我解决这个问题的方法是找到所有边界像素(在 FOV 之外),这是我使用以下代码获得的红色部分之外的第一个黑色像素-

    my_list = []
for i in range(img.shape[0]):
    for j in range(img.shape[1]):
        if (j+1)<=564:
            if (img[i][j+1]==255) and (img[i][j-1]!=255):
                my_list.append([i,j])
        elif (j+1)<=564:
            if img[i][j+1]==0 and img[i][j]!=0:
                my_list.append([i,j])
        elif (i-1)>=0:
            if img[i-1][j]==255 and img[i][j]==0 :
                my_list.append([i,j])
        elif (i+1) >=0:
            if img[i+1][j]==255 and img[i][j]==0:
                my_list.append([i,j])

我上面代码背后的想法是,我可以将遮罩分成4个部分,然后可以根据它找到边界像素- 我在下面标记了 4 个部分(为糟糕的插图道歉)-

现在,在确定 FOV 外的边界像素后,我需要用相邻像素(8 个相邻像素)的平均值替换它们,在这种情况下,这将是 3 个像素的平均值,因为我们正在修改的像素将始终是在角落里,如下图-

所以我的问题是——
1)我的思维过程正确吗?
2)我不知道如何用邻域像素来修改像素?
也欢迎任何其他方法来解决它。

编辑---根据答案解决问题

 while(notroi):
    border_pixels = []
    for i in range(img.size[0]):
        for j in range(img.size[1]):
            if [i,j] not in roi and ([i+1, j] in roi or [i-1, j] in roi or [i, j+1] in roi or [i, j-1] in roi):
                border_pixels.append([i,j])

    for (each_i,each_j) in border_pixels:
        color_sum = 0
        count = 1
        eight_neighbourhood = [[each_i-1,each_j],[each_i+1,each_j],[each_i,each_j-1],[each_i,each_j+1],[each_i-1,each_j-1],[each_i-1,each_j+1],[each_i+1,each_j-1],[each_i+1,each_j+1]]
        for pix_i,pix_j in eight_neighbourhood:
            if (pix_i,pix_j) in roi:
                color_sum+=pixelMap[pix_i,pix_j]
                count+=1
        pixelMap[each_i,each_j]=(color_sum//count)

    for (each_i,each_j) in border_pixels:
        roi.append([each_i,each_j])
        border_pixels.remove([each_i,each_j])
        notroi = notroi-1
        print(notroi)

编辑: 图片获得-

【问题讨论】:

    标签: python image image-processing graphics computer-vision


    【解决方案1】:

    您引用的方法实际上要简单得多。如果您将原始 ROI 作为每像素掩码,则算法在伪代码中如下所示(为清楚起见,省略了边界处理):

    while there are pixels not in the ROI:
        border_pixels = []
    
        # find the border pixels
        for each pixel p=(i, j) in image
            if p is not in ROI and ((i+1, j) in ROI or (i-1, j) in ROI or (i, j+1) in ROI or (i, j-1) in ROI)):
                add p to border_pixels
    
        # calculate the averages
        for each pixel p in border_pixels:
            color_sum = (0, 0, 0)
            count = 0
            for each pixel n in 8-neighborhood of p:
                if n in ROI:
                    color_sum += color(n)
                    count += 1
            color(p) = color_sum / count
    
        # update the ROI
        for each pixel p=(i, j) in border_pixels:
            set p to be in ROI
    

    【讨论】:

    • 但是如何确定 p 的 8 邻域以及如何动态确定您在伪代码中显示的 ROI
    • 我不确定您的误解在哪里。创建蒙版时,只需执行for each pixel: if pixel is red or white or whatever: set pixel to be in ROI 之类的操作。
    • 像素n的颜色。
    • 最简单的做法是在设置时计算不在 ROI 中的像素。然后,每次向 ROI 添加一个像素时,只要计数器大于零,就减少计数器并循环。如果您有工作代码,请发布它,以便人们提出改进建议。 Code Review 最适合这种情况。
    • 如果你不想这样,那么只需存储每个像素与 ROI 的距离。您可以在设置新像素时逐步逼近:新像素的距离是其源像素的最小距离 + 1。然后一旦超过阈值就中止。
    猜你喜欢
    • 1970-01-01
    • 2011-08-10
    • 2012-03-08
    • 2020-11-13
    • 1970-01-01
    • 2012-02-22
    • 2017-06-05
    • 2018-06-17
    相关资源
    最近更新 更多