Python如何批量去除图片上的LOGO(针对LOGO色素不复杂情况)

使用框架 OpenCV

1.先看处理前与处理后的效果

处理前

处理后

操作流程

首先我们需要获取LOGO图片中含有的色素信息:

通过肉眼可以看到处理亲图片中的LOGO中包含三种颜色、白色、黄色、绿色。

这时我们需要精确获取这这三种颜色的HSV的值。

我们需要选择一张图片,然后点击图片上的LOGO位置的色素信息,之后采取鼠标位置点的BGR的值,然后转化成HSV值,代码如下:

import cv2

# 定义鼠标交互函数
def mouseColor(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        print('HSV:', hsv[y, x])  #输出图像坐标(x,y)处的HSV的值

img = cv2.imread('/Users/peng/Desktop/sy/WX20201218-180236@2x.png')  #读进来是BGR格式
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)  #变成HSV格式
cv2.namedWindow("Color Picker")
cv2.setMouseCallback("Color Picker", mouseColor)
cv2.imshow("Color Picker", img)
if cv2.waitKey(0):
    cv2.destroyAllWindows()

分别得到白色、黄色、绿色HSV如下:

# 处理白色
0, 0, 240  #上限
255, 10, 255 #下限

# 处理绿色
80, 190, 134  #上限
85, 235, 182 #下限

# 处理黄色
20, 220, 220  #上限
33, 255, 255 #下限

得到颜色数据后我们需要对图片上的三种颜色进行处理依次处理

处理白色

# 读取图片
img = '/Users/peng/Desktop/sy/1608197551135.jpg'
img = cv2.imread(img)


x = 0
y = 0
w = img.shape[1]
h = img.shape[0]
#print(roi)
roi = img[y:y + h, x:x + w]

# 处理白色
lowerb  = np.array([0, 0, 240])  # 白色下限
upperb = np.array([255, 10, 255])  # 白色上限
roi_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)  # BGR转HSV,处理更精确
mask_blue = cv2.inRange(roi_hsv, lowerb, upperb)  # 蒙版
cv2.imshow('2', mask_blue)
kernel = np.ones((20, 20), np.uint8)  # 卷积核
mask_blue = cv2.dilate(mask_blue, kernel, iterations=1)  # 膨胀
roi = cv2.inpaint(roi, mask_blue, 5, flags=cv2.INPAINT_TELEA)  # 重绘

处理绿色

lowerb = np.array([80, 190, 134])
upperb = np.array([85, 235, 182])
roi_hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
mask_red = cv2.inRange(roi_hsv, lowerb, upperb)
mask_red = cv2.dilate(mask_red, kernel, iterations=1)
roi = cv2.inpaint(roi, mask_red, 3, flags=cv2.INPAINT_TELEA)

处理黄色

# 处理黄色
lowerb  = np.array([20, 220, 220])  # 黄色下限
upperb = np.array([33, 255, 255])  # 黄色上限
roi_hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)  # BGR转HSV,处理更精确
mask_blue = cv2.inRange(roi_hsv, lowerb, upperb)  # 蒙版
#cv2.imshow('2', mask_blue)
kernel = np.ones((20, 20), np.uint8)  # 卷积核
mask_blue = cv2.dilate(mask_blue, kernel, iterations=1)  # 膨胀
roi = cv2.inpaint(roi, mask_blue, 5, flags=cv2.INPAINT_TELEA)  # 重绘

最后重新保存

# 重新填充
img[y:y + h, x:x + w] = roi
#cv2.imshow('after', img)

cv2.imwrite('/Users/peng/Desktop/sy/result13.jpg', img)

批量执行代码如下:

#获取文件下所有文件
def get_img_list(dir, firelist, ext=None):
    newdir = dir
    if os.path.isfile(dir):  # 如果是文件
        firelist.append(dir)
    elif os.path.isdir(dir):  # 如果是目录
        for s in os.listdir(dir):
            newdir = os.path.join(dir, s)
            get_img_list(newdir, firelist, ext)

    return firelist

def read_img():
    image_path = '/opt/sy/bip/car1/product_image'
    imglist = get_img_list(image_path, [], 'bmp')
    imgall = []
    for imgpath in imglist:
        # print(imgpath)
        try:
            imgpath2 = imgpath.replace("car1", "car3")

            temppath = imgpath2[0:imgpath2.rfind("/",1)]

            if not os.path.exists(temppath):
                os.makedirs(temppath)

            img = cv2.imread(imgpath)
            #cv2.imshow('original', img)

            # 选择ROI
            # roi = cv2.selectROI(windowName="original", img=img, showCrosshair=False, fromCenter=False)
            # x, y, w, h = roi

            x = 0
            y = 0
            w = img.shape[1]
            h = img.shape[0]
            # print(roi)
            roi = img[y:y + h, x:x + w]
            # cv2.imshow('1', roi)

            # 处理百色
            lowerb = np.array([0, 0, 240])  # 百色下限
            upperb = np.array([255, 10, 255])  # 百色上限
            roi_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)  # BGR转HSV,处理更精确
            mask_blue = cv2.inRange(roi_hsv, lowerb, upperb)  # 蒙版
            #cv2.imshow('2', mask_blue)
            kernel = np.ones((20, 20), np.uint8)  # 卷积核
            mask_blue = cv2.dilate(mask_blue, kernel, iterations=1)  # 膨胀
            roi = cv2.inpaint(roi, mask_blue, 5, flags=cv2.INPAINT_TELEA)  # 重绘
            # cv2.imshow('2', roi)

            # 处理绿色
            lowerb = np.array([80, 190, 134]) # 绿色下限
            upperb = np.array([85, 235, 182]) # 绿色上限
            roi_hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
            mask_red = cv2.inRange(roi_hsv, lowerb, upperb)
            mask_red = cv2.dilate(mask_red, kernel, iterations=1)
            roi = cv2.inpaint(roi, mask_red, 5, flags=cv2.INPAINT_TELEA)

            # 处理黄色
            lowerb = np.array([20, 220, 220])  # 黄色下限
            upperb = np.array([33, 255, 255])  # 黄色上限
            roi_hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)  # BGR转HSV,处理更精确
            mask_blue = cv2.inRange(roi_hsv, lowerb, upperb)  # 蒙版
            # cv2.imshow('2', mask_blue)
            kernel = np.ones((20, 20), np.uint8)  # 卷积核
            mask_blue = cv2.dilate(mask_blue, kernel, iterations=1)  # 膨胀
            roi = cv2.inpaint(roi, mask_blue, 5, flags=cv2.INPAINT_TELEA)  # 重绘

            # 重新填充
            img[y:y + h, x:x + w] = roi
            # cv2.imshow('after', img)

            cv2.imwrite(imgpath2, img)
            print(imgpath2)
        except:
            print("错误异常:"+imgpath)

    return imgall

read_img()

cv2.waitKey(0)
cv2.destroyAllWindows()

结果展示

 

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
批量修改Word页眉中的logo,可以使用Python中的docx库。docx库可以读取和修改Word文档中的各个部分,包括页眉和页脚。 以下是步骤: 1. 安装docx库。使用pip命令安装即可。 2. 导入docx库。使用import命令导入docx库。 3. 打开Word文档。使用docx库中的Document类打开Word文档,如:doc = Document('test.docx')。 4. 循环遍历每个节。使用docx库中的sections属性获取Word文档中的节,循环遍历每个节。如:for section in doc.sections:。 5. 循环遍历每个页眉。使用docx库中的header属性获取每个节的页眉,循环遍历每个页眉。如:for header in section.headers:。 6. 读取或修改每个页眉中的logo。使用header对象的paragraphs属性获取页眉中的段落,循环遍历每个段落,使用paragraph对象的runs属性获取每个段落中的文本,判断是否为logo,进行修改或替换。 7. 保存修改后的文档。使用doc对象的save方法保存文档。 完整代码示例: ``` from docx import Document doc = Document('test.docx') logo_path = 'logo.png' new_logo_path = 'new_logo.png' for section in doc.sections: for header in section.headers: for paragraph in header.paragraphs: for run in paragraph.runs: if run.text == 'Logo': # 读取logo图片 with open(logo_path, 'rb') as f: logo = f.read() # 替换为新的logo图片 with open(new_logo_path, 'rb') as f: new_logo = f.read() # 判断段落中是否包含logo图片,进行替换 if logo in run._element.xml: run._element.r.clear_content() run.add_picture(new_logo) doc.save('new.docx') ``` 需要注意的是,此代码示例仅适用于Word文档中的单个logo图片。如果页眉中有多个logo图片,需要进行相应的修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值