根据边缘截取图片并缩放缩放

        在之前人体检测的代码里,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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值