- 今天一个同事甩我一段代码,让我实现功能,说是对图片做半透明太慢了
- 我拿到手头一看,代码是这样的,据说是一个别的组算法厉害的大神写的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25# -*- coding: utf-8 -*- import numpy as np import os import cv2 def put_mask(img_path,output_fold): image = cv2.imread(r'E:\testdemo.jpg') bbox1 = [72,41,208,330] bbox2 = [100,80,248,334] zeros1 = np.zeros((image.shape), dtype=np.uint8) zeros2 = np.zeros((image.shape), dtype=np.uint8) zeros_mask1 = cv2.rectangle(zeros1, (bbox1[0], bbox1[1]), (bbox1[2], bbox1[3]),color=(0,0,255), thickness=-1 ) zeros_mask2 = cv2.rectangle(zeros2, (bbox2[0], bbox2[1]), (bbox2[2], bbox2[3]),color=(0, 255, 0), thickness=-1) zeros_mask = np.array((zeros_mask1 + zeros_mask2)) try: # alpha 为第一张图片的透明度 alpha = 1 # beta 为第二张图片的透明度 beta = 0.5 gamma = 0 # cv2.addWeighted 将原始图片与 mask 融合 mask_img = cv2.addWeighted(image, alpha, zeros_mask, beta, gamma) cv2.imwrite(os.path.join(output_fold,'mask_img.jpg'), mask_img) except: print('异常') put_mask(img_path = '107.jpg', output_fold='E:\output')- 我看了之后只是觉得,这代码写的太草率了吧,大家都说python简单,没错,是简单,但是也不能乱写吧。这一看就是把mask层放大到和图片一样大,再做addWeighted,addweight本来就慢,还变成大的来做,就不能只对小的部分做完再拼回去么,于是我写了一下测试代码如下,这甚至都谈不上什么算法,只是工程上的直觉而已,一个个像素处理,自然是能少处理就少处理一些,也才能块一些呗
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17# -*- coding: utf-8 -*- import cv def combine_two_color_images(image1, image2): masklayer, background = image1.copy(), image2.copy() masklayer_height = masklayer.shape[0] masklayer_width = masklayer.shape[1] alpha =0.5 # do composite on the upper-left corner of the background image. blended_portion = cv.addWeighted(masklayer, alpha, background[:masklayer_height,:masklayer_width,:], 1 - alpha, 0, background) background[:masklayer_height,:masklayer_width,:] = blended_portion cv.imshow('composited image', background) cv.waitKey(10000)- 结果测下来,快了非常多,以前慢的感觉完全不存在了,主要原因,我们的mask层,一般只有200 * 200,但是图片大小是1960 * 1080,这个处理级别一下就差了50倍左右,然后我们一般每小时要处理上万张图片的数量级,所以这个差距就差很多了。写代码还是要把效率放心上才是。
- 吐槽完毕。