Python:中心数组图像
使用skimage库,我必须将这些图像居中。我已经找到了应该可以接受偏移量的Python:中心数组图像,python,image,scikit-image,Python,Image,Scikit Image,使用skimage库,我必须将这些图像居中。我已经找到了应该可以接受偏移量的相似变换,但是缺少文档。我如何检测这样图像的角点,然后确定如何将其居中? 阵列始终存在于28x28个映像中。有些图像中有噪声,就像这里的第二个图像,代表一个4。我不小心抓到了两个非常居中的图像,但它们可以在阵列中的任何位置。 在底部,您还可以看到4的更多视觉表示 [[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
相似变换
,但是缺少文档。我如何检测这样图像的角点,然后确定如何将其居中?
阵列始终存在于28x28个映像中。有些图像中有噪声,就像这里的第二个图像,代表一个4。我不小心抓到了两个非常居中的图像,但它们可以在阵列中的任何位置。
在底部,您还可以看到4的更多视觉表示
[[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 203 229 32 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 26 47 47 30 95 254 215 13 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 45 154 185 185 223 253 253 133 175 255 188 19 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 110 253 253 253 246 161 228 253 253 254 92 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 128 245 253 158 137 21 0 48 233 253 233 8 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 139 254 223 25 0 0 36 170 254 244 106 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 55 212 253 161 11 26 178 253 236 113 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 7 155 253 228 80 223 253 253 109 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 141 253 253 253 254 253 154 29 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 110 253 253 253 254 179 38 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 3 171 254 254 254 179 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 171 253 253 253 253 178 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 26 123 254 253 203 156 253 200 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 93 253 254 121 13 93 253 158 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 64 239 253 76 8 32 219 253 126 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 133 254 191 0 5 108 234 254 106 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 132 253 190 5 85 253 236 154 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 153 253 169 192 253 253 77 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 112 253 253 254 236 129 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 17 118 243 191 113 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
[[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 42 164 252 63 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 23 34 0 244 254 112 0 0 0 0 85 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 4 190 225 0 255 185 13 0 0 0 0 95 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 6 170 254 197 64 254 59 0 0 0 0 0 95 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 9 132 254 204 23 112 254 28 0 0 0 0 0 77 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 6 167 254 216 58 24 242 225 16 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 76 254 254 162 85 138 254 188 0 0 0 48 85 25 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 3 159 254 254 254 254 254 228 151 151 214 250 254 75 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 7 79 131 158 254 254 226 225 225 225 190 148 39 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 127 254 148 0 0 0 0 0 0 0 71 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 23 248 201 0 0 0 0 0 0 0 0 36 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 85 254 118 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 12 189 227 22 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 114 254 103 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 44 226 175 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 148 203 59 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 26 242 140 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 131 169 22 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 19 233 65 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 174 109 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]
解决方案代码:
@anmol_uppal提供的代码略有更改
def pad_image(img, pad_t, pad_r, pad_b, pad_l):
"""Add padding of zeroes to an image.
Add padding to an array image.
:param img:
:param pad_t:
:param pad_r:
:param pad_b:
:param pad_l:
"""
height, width = img.shape
# Adding padding to the left side.
pad_left = np.zeros((height, pad_l), dtype = np.int)
img = np.concatenate((pad_left, img), axis = 1)
# Adding padding to the top.
pad_up = np.zeros((pad_t, pad_l + width))
img = np.concatenate((pad_up, img), axis = 0)
# Adding padding to the right.
pad_right = np.zeros((height + pad_t, pad_r))
img = np.concatenate((img, pad_right), axis = 1)
# Adding padding to the bottom
pad_bottom = np.zeros((pad_b, pad_l + width + pad_r))
img = np.concatenate((img, pad_bottom), axis = 0)
return img
def center_image(img):
"""Return a centered image.
:param img:
"""
col_sum = np.where(np.sum(img, axis=0) > 0)
row_sum = np.where(np.sum(img, axis=1) > 0)
y1, y2 = row_sum[0][0], row_sum[0][-1]
x1, x2 = col_sum[0][0], col_sum[0][-1]
cropped_image = img[y1:y2, x1:x2]
zero_axis_fill = (images[0].shape[0] - cropped_image.shape[0])
one_axis_fill = (images[0].shape[1] - cropped_image.shape[1])
top = zero_axis_fill / 2
bottom = zero_axis_fill - top
left = one_axis_fill / 2
right = one_axis_fill - left
padded_image = pad_image(cropped_image, top, left, bottom, right)
return padded_image
# Usage is in a for loop that iterates through 60.000 images.
for item in permuList:
shuImages.append(center_image(images[item]).reshape((28 * 28)))
因此,问题的第一部分是找到包含图像的边界框,第二部分涉及图像居中,第二部分我们将为边界框的每个顶点添加填充
col_sum = np.where(np.sum(a, axis = 0)>0)
row_sum = np.where(np.sum(a, axis = 1)>0)
y1, y2 = row_sum[0][0], row_sum[0][-1]
x1, x2 = col_sum[0][0], col_sum[0][-1]
print x1, y1
print x2, y2
第1部分:
要绘制边界框,方法是我们可以迭代每一行,找到一行包含1个或多个非零元素,从顶部和底部执行此过程,我们将获得Y轴
和X轴
的限制,通过迭代列,Numpy提供了一些很棒的函数,例如,我们将使用此函数检查行/列是否有任何非零字符,在这种情况下,sum>0
:
设(x1,y1)为左上角坐标,(x2,y2)为右下角坐标,这两点足以定义边界框
col_sum = np.where(np.sum(a, axis = 0)>0)
row_sum = np.where(np.sum(a, axis = 1)>0)
y1, y2 = row_sum[0][0], row_sum[0][-1]
x1, x2 = col_sum[0][0], col_sum[0][-1]
print x1, y1
print x2, y2
第二部分:
现在我们必须将图像居中,而不是计算每侧所需的填充,我们只需将图像裁剪为边界框的形状,然后对每侧应用相等的填充
def add_padding(img, pad_l, pad_t, pad_r, pad_b):
height, width = img.shape
#Adding padding to the left side.
pad_left = np.zeros((height, pad_l), dtype = np.int)
img = np.concatenate((pad_left, img), axis = 1)
#Adding padding to the top.
pad_up = np.zeros((pad_t, pad_l + width))
img = np.concatenate((pad_up, img), axis = 0)
#Adding padding to the right.
pad_right = np.zeros((height + pad_t, pad_r))
img = np.concatenate((img, pad_right), axis = 1)
#Adding padding to the bottom
pad_bottom = np.zeros((pad_b, pad_l + width + pad_r))
img = np.concatenate((img, pad_bottom), axis = 0)
return img
cropped_image = img[y1:y2, x1:x2]
padded_image = add_padding(cropped_image, 20, 20, 20, 20)
我对这件事很感兴趣,碰巧也在处理同一个问题,我很乐意帮助你,请解释更多?这是输入还是预期输出?在上面的例子中,图像似乎居中。这是输入。我不小心抓到了一张非常正中的图片。还有几千张这样的图片,而且每张图片都不一样。检测这些图片的角点的答案是什么?你能用逗号分隔的格式粘贴输入吗?这些空格妨碍了我将数据转换为其他类型。@Ben,这是否意味着
axis=1
将获得行数?太好了!看起来很好,谢谢。我对它做了一些修改,以保持28x28的比率。当我完成并且一切就绪后,我将发布编辑后的代码。如果使用np.pad
和skimage.measure.regionprops(image!=0)
(返回边界框和剪切图像),应该可以简化这一过程。