裁剪具有不同黑色边距的图像

时间:2018-10-25 01:14:00

标签: python-3.x image-processing image-preprocessing

我有一个图像数据集,在将其输入深度学习算法之前,我需要将其裁剪为相同大小。如下图所示,所有图像的黑边尺寸均不同。 关于裁剪具有不同边距大小的图像的任何建议。 enter image description here

enter image description here enter image description here

4 个答案:

答案 0 :(得分:1)

首先,对强度较低的阈值进行 阈值 (如果您的背景绝对是黑色的,甚至可以将阈值强度设为1)来确定所有非边界成分。

接下来,使用 连接组件标签 确定所有隔离的前景组件。然后,您感兴趣的中央扫描图像应始终是最大的组成部分。裁剪出最大的组件,以去除边框以及所有可能的非黑色假象(标签,字母等)。您应该只剩下无边界扫描。

您可以在任何基本图像处理库中找到所需的所有算法。我个人建议研究OpenCV,它们也包括浮游植物绑定。

答案 1 :(得分:1)

一种解决方法如下:

  • 从左上角开始用红色填充图像,并与该处的黑色像素相距大约5%。

enter image description here

  • 现在将不是红色的所有内容都变成白色-因为此后的下一步将查找白色像素。

enter image description here

  • 现在使用findContours()(查找白色物体)并选择最大的白色轮廓作为图像并裁剪。

您可以考虑以下一些想法,从而使事情变得更加健壮:

  • 您可以首先将图像的副本规范化为从黑到白的全部范围,以防出现黑边。

  • 您可以检查一个以上的像素,或者所有角落的像素实际上都是黑色的,以防获取无边界的图像。

  • 如果裁切后的图像似乎少于图像总面积的70%,您也可以提出问题。

  • 您可以考虑使用具有9x9正方形结构元素的形态学开口作为倒数第二步,以便在findContrours()之前整理事物。

enter image description here

答案 2 :(得分:1)

由于边框颜色为黑色(几乎是完美的黑色),并且在所有图像中都相同,因此我建议应用二进制阈值,使除黑色区域外的所有内容都变为白色(255)。现在,某些图像区域也可能会受到影响,但这不是问题。

现在图像中的find contours和第二大轮廓将成为您的区域。计算该轮廓的矩形边界框,并在原始图像中裁剪相同的区域。

答案 3 :(得分:0)

这是此问题的解决方案代码:

import warnings
warnings.filterwarnings('always')
warnings.filterwarnings('ignore')
import cv2
import numpy as np
import os

path = "data/benign/"
img_resized_dir = "data/pre-processed/benign/"
dirs = os.listdir(path)

def thyroid_scale():
    for item in dirs:
    if os.path.isfile(path+item):
        img = cv2.imread(path+item)
        gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
        ret,thresh = cv2.threshold(gray,0,255,0)
        im2, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

        areas = [cv2.contourArea(c) for c in contours]
        max_index = np.argmax(areas)
        cnt=contours[max_index]
        x,y,w,h = cv2.boundingRect(cnt)
        crop_img = img[y+35:y+h-5,x+25:x+w-10]
        resize_img = cv2.resize(crop_img, (300, 250), interpolation = cv2.INTER_CUBIC)
        cv2.imwrite(img_resized_dir+item, resize_img)

thyroid_scale()