在之前人体检测的代码里,extract_hog函数中,求hog之前就使用resize函数对图片进行了缩放。
resize函数:https://www.jb51.net/article/163516.htm
def resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None):,其中interpolation是缩放选择的插值方式,如下:
从上到下,再opencv里分别为interpolation=0,1,2,3
使用interpolation=0,原来邻接的像素分开:
————————>
使用interpolation=1,2,3,插值产生新的像素,不再是二值图:
————————>
根据边缘截取图片的代码:
import cv2
# Press the green button in the gutter to run the script.
if __name__ == '__main__':
image = cv2.imread('test2.png') # a black objects on white image is better
#image = cv2.Canny(image, 128, 256) #用于褶皱图片,全黑,识别不出边缘
image = cv2.Canny(image, 100, 150)
cv2.imshow('Canny后图片', image)
cv2.imwrite('./canny_out.png', image)
'''
#opencv自带的检测边缘的方法
contours, hierarchy = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
#cv2.drawContours(thresh, contours, -1, (255, 0, 0), 2)
#输出边缘坐标中的max x和min x
x = contours[0][0][0][0]
max_x = x
min_x = x
for x_y in contours[0]:
x = x_y[0][0]
if(x > max_x):
max_x = x
if(x < min_x):
min_x = x
print('最大横坐标为',max_x)
print('最小横坐标为',min_x)
#输出边缘坐标中的max y和min y
y = contours[0][0][0][1]
max_y = y
min_y = y
for x_y in contours[0]:
y = x_y[0][1]
if (y > max_y):
max_y = y
if (y < min_y):
min_y = y
print('最大纵坐标为',max_y)
print('最小纵坐标为',min_y)
#剪切图片
image_cut = image[min_y:max_y, min_x:max_x]
cv2.imshow('contours剪切后图片',image_cut)
cv2.imwrite('./canny_out.png',image)
cv2.imwrite('./contours_cut.png', image_cut)
'''
#从上至下遍历,找到min_y,从下至上找到max_y,x从左到右再从右到左同理
for y in range(image.shape[0]):
for x in range(image.shape[1]):
if image[y][x] == 255:
max_y = y
break
for y in range(image.shape[0]-1,-1,-1):
for x in range(image.shape[1]):
if image[y][x] == 255:
min_y = y
break
for x in range(image.shape[1]):
for y in range(image.shape[0]):
if image[y][x] == 255:
max_x = x
break
for x in range(image.shape[1]-1,-1,-1):
for y in range(image.shape[0]):
if image[y][x] == 255:
min_x = x
break
print('max x为',max_x ,'max y为',max_y,'min x为',min_x,'min y为',min_y)
#把坐标范围扩大些,不然会紧挨着边缘,不好看,也为了之后做缩放
if min_y != 0 :
min_y = min_y - int(min_y/2)
if min_x != 0 :
min_x = min_x - int(min_x/2)
if max_y != image.shape[0] :
max_y = max_y + int((image.shape[0] - max_y)/2)
if max_x != image.shape[1] :
max_x = max_x + int((image.shape[1] - max_x)/2)
image_cut = image[min_y:max_y, min_x:max_x]
print('扩展后坐标''max x为', max_x, 'max y为', max_y, 'min x为', min_x, 'min y为', min_y)
cv2.imwrite('./my_cut.png', image_cut)
cv2.imshow('我的方法剪切后图片', image_cut)
cv2.waitKey(0)
# See PyCharm help at https://www.jetbrains.com/help/pycharm/