裁剪具有不同黑边距的图像
crop images with different black margins
我有一个图像数据集,在将其提供给深度学习算法之前,我需要将其裁剪成相同的大小。如下图所示,所有图像都有不同大小的黑边。
关于裁剪具有不同边距大小的图像的方法的任何建议。
首先,使用低强度阈值进行阈值处理(如果你的背景绝对是全黑的,你甚至可以阈值强度为 1) 以确定所有非边界组件。
接下来,使用连通分量标记确定所有孤立的前景分量。您感兴趣的中央扫描图像应该总是导致最大的组件。裁剪掉这个最大的组件以移除边框以及所有可能的非黑色工件(标签、字母等)。你应该只剩下无边界扫描。
您可以在任何基本图像处理库中找到所需的所有算法。我个人建议查看 OpenCV,它们还包括植物结合物。
一种方法如下:
- 从左上角开始用红色填充图像,并允许与那里的黑色像素有大约 5% 的发散。
- 现在将所有不是红色的都变成白色 - 因为下一步会寻找白色像素。
- 现在使用
findContours()
(寻找白色物体)并选择最大的白色轮廓作为图像并裁剪成它。
您可以通过考虑以下一些想法来考虑让事情变得更健壮:
您可以先将图像的副本标准化为从黑到白的全范围,以防出现接近黑色的边框。
您可以检查是否有多个像素,或者所有角像素实际上都是黑色的,以防您得到没有边框的图像。
如果裁剪后的图像看起来小于总图像区域的 70%,您也可以提出问题。
您可以考虑使用 9x9 正方形结构元素作为倒数第二个步骤来整理 findContrours()
.
之前的形态学开口
由于您的边框颜色是黑色(接近完美的黑色)并且在所有图像中都是相同的,我建议应用二进制阈值使除黑色区域以外的所有内容都为白色 (255)。现在一些图像区域也可能受到影响,但这不是问题。
现在 find contours 在图像中,第二大轮廓将是您所在的区域。计算此轮廓的矩形边界框并裁剪原始图像中的相同区域。
此题的解答代码如下:
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()
我有一个图像数据集,在将其提供给深度学习算法之前,我需要将其裁剪成相同的大小。如下图所示,所有图像都有不同大小的黑边。
关于裁剪具有不同边距大小的图像的方法的任何建议。
首先,使用低强度阈值进行阈值处理(如果你的背景绝对是全黑的,你甚至可以阈值强度为 1) 以确定所有非边界组件。
接下来,使用连通分量标记确定所有孤立的前景分量。您感兴趣的中央扫描图像应该总是导致最大的组件。裁剪掉这个最大的组件以移除边框以及所有可能的非黑色工件(标签、字母等)。你应该只剩下无边界扫描。
您可以在任何基本图像处理库中找到所需的所有算法。我个人建议查看 OpenCV,它们还包括植物结合物。
一种方法如下:
- 从左上角开始用红色填充图像,并允许与那里的黑色像素有大约 5% 的发散。
- 现在将所有不是红色的都变成白色 - 因为下一步会寻找白色像素。
- 现在使用
findContours()
(寻找白色物体)并选择最大的白色轮廓作为图像并裁剪成它。
您可以通过考虑以下一些想法来考虑让事情变得更健壮:
您可以先将图像的副本标准化为从黑到白的全范围,以防出现接近黑色的边框。
您可以检查是否有多个像素,或者所有角像素实际上都是黑色的,以防您得到没有边框的图像。
如果裁剪后的图像看起来小于总图像区域的 70%,您也可以提出问题。
您可以考虑使用 9x9 正方形结构元素作为倒数第二个步骤来整理
findContrours()
. 之前的形态学开口
由于您的边框颜色是黑色(接近完美的黑色)并且在所有图像中都是相同的,我建议应用二进制阈值使除黑色区域以外的所有内容都为白色 (255)。现在一些图像区域也可能受到影响,但这不是问题。
现在 find contours 在图像中,第二大轮廓将是您所在的区域。计算此轮廓的矩形边界框并裁剪原始图像中的相同区域。
此题的解答代码如下:
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()