python+opencv图像处理,使用opencv和python实现图像的智能处理
OpenCV-Python是一个Python库,旨在解决计算机视觉问题。本文将利用Python OpenCV实现图像识别和替换功能。有兴趣的朋友可以试试。
OpenCV-Python是一个Python库,旨在解决计算机视觉问题。
OpenCV是一个开源的计算机视觉库,由英特尔的Gary Bradski于1999年创建。Bradski在访问中注意到,许多优秀的大学实验室都有非常完整的内部开放式计算机视觉接口。这些接口从一个班级的学生传递到另一个班级。新人用这些接口比反复造轮子方便多了。这些接口可以使它们在以前的基础上更有效地工作。OpenCV是基于为计算机视觉提供通用接口的目标而规划的。
安装opencv
pip3安装-I https://pypi.doubanio.com/simple/opencv-python
想法:
1.首先区分三张图:
基本映像表示初始化映像;
模板代表大图中需要匹配的图片;
白色图片是需要替换的图片。
2.然后对模板图片进行缩小,逐像素匹配,设置阈值。判断匹配度达到阈值的图片在初始图片中;否则,忽略。
3.当最大阈值匹配时,返回该区域的位置(x,y)。
4.然后将白色图片调整到相应的大小,填充到目标区域。
匹配功能:
检查模板图片是否包含目标图片
def make_cv2(照片1,照片2):
全局x,y,w,h,编号1,标志
start time=datetime . datetime . now()
#阅读基础图片
img_rgb=cv2.imread(f{photo1} )
#阅读模板图片
template=cv2 . im read(f“{ photo 2 }”)
h,w=template.shape[:-1]
打印(“初始宽度和高度”,高,宽)
res=cv2.matchTemplate(img_rgb,Template,cv2。TM_CCOEFF_NORMED)
Print(初始最大相似性,res.max())
threshold=res.max()
,如果相似度小于0.2,则不予考虑;如果相似度在[0.2-0.75]之间,逐渐缩小图片
打印(阈值)
而阈值=0.1和阈值=0.83:
如果w=20并且h=20:
w=w - 1
h=h - 1
template=cv2.resize(
模板,(w,h),插值=cv2。间_立方)
res=cv2.matchTemplate(img_rgb,Template,cv2。TM_CCOEFF_NORMED)
threshold=res.max()
打印(“宽度:”,w,“高度:”,h,“相似度:”,阈值)
else:
破裂
达到0.75覆盖率前的图片
如果阈值为0.8:
loc=np.where(res=阈值)
x=int(loc[1])
y=int(loc[0])
打印(覆盖图片左上角坐标: ,x,y)
对于邮政编码为(*loc[:-1]):的pt
cv2 .矩形(
img_rgb,pt,(pt[0] w,pt[1] h),(255,144,51),1)
num_1=1
endtime=datetime.datetime.now()
打印(耗时: ,结束时间-开始时间)
在飞行器上的设备
rlay_transparent(x, y, photo1, photo3)
else:
flag = False
replace函数:
"""将目标图片镶嵌到指定坐标位置"""def overlay_transparent(x, y, photo1, photo3):
#覆盖图片的时候上下移动的像素空间
y += 4
global w, h, num_2
background = cv2.imread(f{photo1})
overlay = cv2.imread(f{photo3})
"""缩放图片大小"""
overlay = cv2.resize(overlay, (w, h), interpolation=cv2.INTER_CUBIC)
background_width = background.shape[1]
background_height = background.shape[0]
if x >= background_width or y >= background_height:
return background
h, w = overlay.shape[0], overlay.shape[1]
if x + w > background_width:
w = background_width - x
overlay = overlay[:, :w]
if y + h > background_height:
h = background_height - y
overlay = overlay[:h]
if overlay.shape[2] < 4:
overlay = np.concatenate([overlay, np.ones((overlay.shape[0], overlay.shape[1], 1), dtype=overlay.dtype) * 255],axis=2,)
overlay_image = overlay[..., :3]
mask = overlay[..., 3:] / 255.0
background[y:y + h,x:x + w] = (1.0 - mask) * background[y:y + h,x:x + w] + mask * overlay_image
# path = result
path =
cv2.imwrite(os.path.join(path, f1.png), background)
num_2 += 1
print(插入成功。)
init()
每次执行需要初始化x,y(图片匹配初始位置参数),w,h(图片缩放初始宽高)
x = 0y = 0
w = 0
h = 0
flag = True
threshold = 0
template =
num_1 = 0
num_2 = 0
photo3 =
"""参数初始化"""
def init():
global x, y, w, h, threshold, template,flag
x = 0
y = 0
w = 0
h = 0
threshold = 0
template =
完整代码
import cv2import datetime
import os
import numpy as np
x = 0
y = 0
w = 0
h = 0
flag = True
threshold = 0
template =
num_1 = 0
num_2 = 0
photo3 =
"""参数初始化"""
def init():
global x, y, w, h, threshold, template,flag
x = 0
y = 0
w = 0
h = 0
threshold = 0
template =
"""检查模板图片中是否包含目标图片"""
def make_cv2(photo1, photo2):
global x, y, w, h, num_1,flag
starttime = datetime.datetime.now()
img_rgb = cv2.imread(f{photo1})
template = cv2.imread(f{photo2})
h, w = template.shape[:-1]
print(初始宽高, h, w)
res = cv2.matchTemplate(img_rgb, template, cv2.TM_CCOEFF_NORMED)
print(初始最大相似度, res.max())
threshold = res.max()
""",相似度小于0.2的,不予考虑;相似度在[0.2-0.75]之间的,逐渐缩小图片"""
print(threshold)
while threshold >= 0.1 and threshold <= 0.83:
if w >= 20 and h >= 20:
w = w - 1
h = h - 1
template = cv2.resize(
template, (w, h), interpolation=cv2.INTER_CUBIC)
res = cv2.matchTemplate(img_rgb, template, cv2.TM_CCOEFF_NORMED)
threshold = res.max()
print(宽度:, w, 高度:, h, 相似度:, threshold)
else:
break
"""达到0.75覆盖之前的图片"""
if threshold > 0.8:
loc = np.where(res >= threshold)
x = int(loc[1])
y = int(loc[0])
print(覆盖图片左上角坐标:, x, y)
for pt in zip(*loc[::-1]):
cv2.rectangle(
img_rgb, pt, (pt[0] + w, pt[1] + h), (255, 144, 51), 1)
num_1 += 1
endtime = datetime.datetime.now()
print("耗时:", endtime - starttime)
overlay_transparent(x, y, photo1, photo3)
else:
flag = False
"""将目标图片镶嵌到指定坐标位置"""
def overlay_transparent(x, y, photo1, photo3):
y += 0
global w, h, num_2
background = cv2.imread(f{photo1})
overlay = cv2.imread(f{photo3})
"""缩放图片大小"""
overlay = cv2.resize(overlay, (w, h), interpolation=cv2.INTER_CUBIC)
background_width = background.shape[1]
background_height = background.shape[0]
if x >= background_width or y >= background_height:
return background
h, w = overlay.shape[0], overlay.shape[1]
if x + w > background_width:
w = background_width - x
overlay = overlay[:, :w]
if y + h > background_height:
h = background_height - y
overlay = overlay[:h]
if overlay.shape[2] < 4:
overlay = np.concatenate([overlay, np.ones((overlay.shape[0], overlay.shape[1], 1), dtype=overlay.dtype) * 255],axis=2,)
overlay_image = overlay[..., :3]
mask = overlay[..., 3:] / 255.0
background[y:y + h,x:x + w] = (1.0 - mask) * background[y:y + h,x:x + w] + mask * overlay_image
# path = result
path =
cv2.imwrite(os.path.join(path, f1.png), background)
num_2 += 1
print(插入成功。)
init()
if __name__ == "__main__":
photo1 = "1.png"
photo2 = "3.png"
photo3 = "white.png"
while flag == True:
make_cv2(photo1, photo2)
overlay_transparent(x, y, photo1, photo3)
执行结果:
到此这篇关于Python+OpenCV实现图像识别替换功能详解的文章就介绍到这了,更多相关Python OpenCV图像识别替换内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。