基于opencv-python的签名抠图程序

做了一点调整,能够实现对于图片进行缩放并且进行感兴趣区域的自适应阈值分割,最终生成签名的无背景图像。
待测试图片:
在这里插入图片描述
全部代码如下:

import cv2
import matplotlib.pyplot as plt
import numpy as np
import cv2
import time
global img
global point1,point2

def on_mouse(event,x,y,flags,param):
    global img,point1,point2
    img2=img.copy()
    if event==cv2.EVENT_LBUTTONDOWN:#左键点击
        point1=(x,y)
        cv2.circle(img2,point1,10,(0,255,0),5)
        cv2.imshow('image',img2)

    elif event==cv2.EVENT_MOUSEMOVE and (flags&cv2.EVENT_FLAG_LBUTTON):#移动鼠标,左键拖拽
        cv2.rectangle(img2,point1,(x,y),(255,0,0),15)#需要确定的就是矩形的两个点(左上角与右下角),颜色红色,线的类型(不设置就默认)。
        cv2.imshow('image',img2)

    elif event==cv2.EVENT_LBUTTONUP:#左键释放
        point2=(x,y)
        cv2.rectangle(img2,point1,point2,(0,0,255),5)#需要确定的就是矩形的两个点(左上角与右下角),颜色蓝色,线的类型(不设置就默认)。
        cv2.imshow('image',img2)
        min_x=min(point1[0],point2[0])
        min_y=min(point1[1],point2[1])
        width=abs(point1[0]-point2[0])
        height=abs(point1[1]-point2[1])
        cut_img=img[min_y:min_y+height,min_x:min_x+width]
        gen_sig(cut_img)
        # cv2.imwrite('crop_cell_nucleus.tif',cut_img)

def gen_sig(img):
    #设定阈值
    import time
    name = str(time.strftime('%Y-%m-%d-%H-%M-%S',time.localtime()))+'.png'
    temp = img[:][:][0]
    mmax = 0
    mmin = 255
    for i in range(len(temp)):
        for j in  range(len(temp[0])):
            mmax = max(mmax, temp[i][j])
            mmin = min(mmin, temp[i][j])
    thresh = mmax*0.5+mmin*0.5-15

    result = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA)

    B,G,R = cv2.split(img)

    retval1,R=cv2.threshold(R,thresh,255,cv2.THRESH_BINARY)
    _, Alpha= cv2.threshold(R, thresh, 255, cv2.THRESH_BINARY_INV)

    B2,G2,R2,A2 = cv2.split(result)
    A2 = Alpha
    result = cv2.merge([B2,G2,R2,A2]) #通道合并


    cv2.imwrite(name, result)

def main(path):
    global img
    img=cv2.imread(path)
    cv2.namedWindow('image',0)
    cv2.resizeWindow('image', 700, 900)   # 自己设定窗口图片的大小
    cv2.setMouseCallback('image',on_mouse)
    cv2.imshow('image',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()



if __name__=='__main__':
    #载入原图,并转化为灰度图像
    path = r'./kk.jpg'
    main(path)

截取感兴趣区域:
在这里插入图片描述
生成抠图的背景透明图片:
在这里插入图片描述

参考文献:

OpenCV技巧 | 常用格式图片保存为透明背景图片(附Python源码)-教你轻松制作Logo
使用python+opencv用鼠标选中ROI(感兴趣区域)裁剪,并保存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

deyiwang89

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值