Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 裁剪具有不同黑边的图像_Python 3.x_Image Processing_Image Preprocessing - Fatal编程技术网

Python 3.x 裁剪具有不同黑边的图像

Python 3.x 裁剪具有不同黑边的图像,python-3.x,image-processing,image-preprocessing,Python 3.x,Image Processing,Image Preprocessing,我有一个图像数据集,在将其提供给深度学习算法之前,我需要将其裁剪到相同的大小。如下图所示,所有图像都有不同大小的黑色边距。 关于裁剪具有不同边距大小的图像的方法的任何建议。 首先,使用低强度阈值(如果您的背景完全是黑色的,您甚至可以使用强度为1的阈值)来确定所有非边界组件 接下来,使用连接的组件标签来确定所有孤立的前景组件。然后,您感兴趣的中心扫描图像应始终产生最大的分量。裁剪出这个最大的组件以删除边框以及所有可能的非黑色工件(标签、字母等)。您应该只剩下无边界扫描 您可以在任何基本图像处理库

我有一个图像数据集,在将其提供给深度学习算法之前,我需要将其裁剪到相同的大小。如下图所示,所有图像都有不同大小的黑色边距。 关于裁剪具有不同边距大小的图像的方法的任何建议。

首先,使用低强度阈值(如果您的背景完全是黑色的,您甚至可以使用强度为1的阈值)来确定所有非边界组件

接下来,使用连接的组件标签来确定所有孤立的前景组件。然后,您感兴趣的中心扫描图像应始终产生最大的分量。裁剪出这个最大的组件以删除边框以及所有可能的非黑色工件(标签、字母等)。您应该只剩下无边界扫描

您可以在任何基本图像处理库中找到所需的所有算法。我个人建议研究,它们还包括植物素结合

首先,使用低强度阈值(如果您的背景绝对是黑色的,您甚至可以使用强度为1的阈值)进行阈值化,以确定所有非边界组件

接下来,使用连接的组件标签来确定所有孤立的前景组件。然后,您感兴趣的中心扫描图像应始终产生最大的分量。裁剪出这个最大的组件以删除边框以及所有可能的非黑色工件(标签、字母等)。您应该只剩下无边界扫描


您可以在任何基本图像处理库中找到所需的所有算法。我个人建议研究,它们还包括植物素结合

实现这一点的一种方法如下:

  • 从左上角开始用红色填充图像,并允许与黑色像素相差约5%

  • 现在把所有不是红色的东西都变成白色——因为接下来的步骤是寻找白色像素

  • 现在使用
    findContours()
    (查找白色对象)并选择最大的白色轮廓作为图像,然后进行裁剪

你可以考虑以下一些想法使事情变得更稳健:

  • 您可以先将图像的副本标准化为全黑到白的范围,以防出现任何接近黑色边框的副本

  • 您可以检查多个或所有角点像素是否为黑色,以防获得没有边框的图像

  • 如果裁剪后的图像小于(比如)总图像面积的70%,您还可以标记问题

  • >P>可以考虑以9x9方结构元素为形态的第二步,在代码> > FunTror()/<代码> >

    之前整理。

实现这一点的一种方法如下:

  • 从左上角开始用红色填充图像,并允许与黑色像素相差约5%

  • 现在把所有不是红色的东西都变成白色——因为接下来的步骤是寻找白色像素

  • 现在使用
    findContours()
    (查找白色对象)并选择最大的白色轮廓作为图像,然后进行裁剪

你可以考虑以下一些想法使事情变得更稳健:

  • 您可以先将图像的副本标准化为全黑到白的范围,以防出现任何接近黑色边框的副本

  • 您可以检查多个或所有角点像素是否为黑色,以防获得没有边框的图像

  • 如果裁剪后的图像小于(比如)总图像面积的70%,您还可以标记问题

  • >P>可以考虑以9x9方结构元素为形态的第二步,在代码> > FunTror()/<代码> >

    之前整理。

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


现在在图像中,第二大轮廓将是您的区域。计算此轮廓的矩形边界框,并在原始图像中裁剪相同的区域。

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


现在在图像中,第二大轮廓将是您的区域。计算此轮廓的矩形边界框,并在原始图像中裁剪相同的区域。

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

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()

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

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()

我的答案或其他答案解决了你的问题吗?如果是这样,请考虑接受它作为您的答案-点击空心蜱/支票旁边的选票计数。如果没有,请说出什么不起作用,以便我或其他人可以进一步帮助您。谢谢我的答案或其他答案解决了你的问题吗?如果是这样,请考虑接受它作为您的答案-点击空心蜱/支票旁边的选票计数。如果没有,请说出什么不起作用,以便我或其他人可以进一步帮助您。谢谢