基于Python-OpenCV的图片覆盖技术——即把一个图片P到另一个图片上

该博客介绍了一种使用Python和OpenCV库处理图片覆盖的方法,特别是在被抠图部分为黑色RGB(0,0,0)的情况下。作者通过降维处理避免了传统cv2.add方法可能导致的彩图失真问题,实现了两张图片的无缝融合。提供的代码示例展示了如何将一张图片覆盖到另一张图片的指定位置,并处理黑色像素,确保完美结合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介一下前提 : 我所使用的覆盖图片都是已经被抠图的,由于我采用的是网上在线抠图,​​​​​

被抠图图片RGB是黑色RGB——即(0, 0, 0)。

先看一下我们不希望忘得到的结果:很明显被抠除部分显色了/

 再看一下处理后得到的效果 : 

很明显,两张图片完美切合(边缘有点白色,是抠图问题)。下面是实现源码——针对在前提条件下的 所有图片(不过最好是在覆盖图片在被覆盖图片内部的前提下,也就是说,我的实现原理没有考虑到图像像素大小问题)

# 图片覆盖技术

import cv2
import numpy

def addTogether(img_bg : str, img_on : str, location : tuple or list, title=None)->None:
    """
    把被扣图的图片覆盖到一个背景上面
    :param img_bg: 背景图片
    :param img_on
### 使用 OpenCVPython 实现车牌识别 #### 收集像 为了构建有效的车牌识别系统,首先需要收集足够的车牌图片作为数据源。这些图片覆盖不同的光照条件、角度和天气状况,以确保模型具有良好的泛化能力。 #### 预处理阶段 预处理的目标是对输入的彩色像执行必要的转换,以便更好地突出目标对象——即车牌本身。这通常涉及以下几个方面: - **灰度化**:将RGB色彩模式下的像转化为单通道的灰度,减少计算复杂度并简化后续处理过程[^1]。 ```python import cv2 def convert_to_grayscale(image_path): image = cv2.imread(image_path) gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) return gray_image ``` - **降噪和平滑**:应用高斯模糊或其他类型的滤波器来去除噪声干扰,使像更加清晰稳定。 ```python blurred_image = cv2.GaussianBlur(gray_image, (5, 5), 0) ``` - **二值化**:设定阈值将像素分为黑白两类,从而形成易于分析的二值像;可以使用全局固定阈值法或自适应局部阈值法。 ```python _, binary_image = cv2.threshold(blurred_image, 127, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU) ``` - **边缘检测**:通过Canny算子或者其他方式捕捉物体边界信息,有助于精确定位车牌位置。 ```python edges = cv2.Canny(binary_image, 50, 150) ``` #### 定位车牌 一旦完成了上述预处理步骤,则可以通过多种手段找到可能存在的车牌区域。常用的技术有颜色空间变换寻找特定色调范围内的连通域,或是借助于几何形状特征(比如矩形比例)、纹理特性等来进行筛选过滤。 ```python contours, _ = cv2.findContours(edges.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for contour in contours: x, y, w, h = cv2.boundingRect(contour) aspect_ratio = float(w)/h if 2 <= aspect_ratio <= 6 and w*h >= 80*30: # 假设合理的宽高比及面积大小 license_plate_region = blurred_image[y:y+h,x:x+w] break ``` #### 校正倾斜 当发现候选区后,还需考虑其是否存在旋转失真现象。此时可运用仿射变换或者透视投影映射等方式调整至水平状态,方便下一步操作。 ```python if not isinstance(license_plate_region, type(None)): rect = cv2.minAreaRect(cv2.findNonZero(~binary_license_plate)) box = np.intp(cv2.boxPoints(rect)) src_pts = box.astype("float32") dst_pts = np.array([[0, 0], [w-1, 0], [w-1, h-1], [0, h-1]], dtype="float32") M = cv2.getPerspectiveTransform(src_pts, dst_pts) corrected_lp_img = cv2.warpPerspective(license_plate_region, M, (w,h)) else: print('No valid region found.') ``` #### 字符分割 经过矫正之后得到较为规整的标准矩形牌照形,接下来的任务就是把上面的文字逐一分离出来单独处理。一般会先做一次垂直方向上的直方统计,依据空白间隔判断各字之间的界限所在之处。 ```python histogram = np.sum(corrected_lp_img == 0, axis=0) char_positions = [] start_index = None in_char = False for i, value in enumerate(histogram): if not in_char and value > threshold_value: start_index = i in_char = True elif in_char and value <= threshold_value: char_positions.append((start_index,i)) in_char = False ``` #### 特征提取与分类 最后一步便是针对每一个被切分出来的字符单元实施具体的辨识动作了。这里可以选择传统的机器学习方法如SVM(Support Vector Machine),也可以尝试更先进的深度学习框架CNN(Convolutional Neural Network)。对于简单的应用场景而言,甚至可以直接采取模板匹配策略完成初步的结果输出[^2]。 ```python from sklearn import svm clf = svm.SVC(gamma='scale') # 训练样本... characters = ['A', 'B', ... ] # 所有可能出现的大写字母列表 labels = [...] # 对应标签数组 features = [...] # 提取后的特征向量集合 clf.fit(features, labels) predictions = clf.predict(test_features) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

「已注销」

若您有别的建议,请在评论区留言

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

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

打赏作者

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

抵扣说明:

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

余额充值