youcans 的 OpenCV 例程200篇190.基于图像分割的图像融合
Posted 小白YouCans
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了youcans 的 OpenCV 例程200篇190.基于图像分割的图像融合相关的知识,希望对你有一定的参考价值。
【youcans 的 OpenCV 例程200篇】190.基于图像分割的图像融合
两张图像直接进行加法运算后图像的颜色会改变,通过加权加法实现图像混合后图像的透明度会改变,都不能实现图像的叠加。
实现图像的叠加,需要综合运用图像分割、图像掩模、位操作和图像加法的操作。
- 确定图像叠加位置,将 Lena 图像中的叠加位置裁剪出来,使叠加图像的尺寸相同;
- 对前景图像进行二值化处理,生成黑白掩模图像 mask(LOGO区域黑色遮盖)及其反转掩模图像 maskInv (LOGO区域白色开窗);
- 以黑白掩模 mask(LOGO区域黑色遮盖)作为掩模,对背景图像(Lena裁剪图)进行位操作,LOGO区域遮盖为黑色,其它区域保持不变,得到叠加背景图像 img1BG;
- 以反转掩模 maskInv(LOGO区域白色开窗)作为掩模,对前景图像(CVlogo)进行位操作,LOGO区域保持不变,其它区域遮盖为黑色,得到叠加前景图像 img2FG;
- 背景图像 img1BG 和 前景图像 img2FG 通过 cv2.add 加法运算,得到裁剪部分的叠加图像;
- 用叠加图像替换Lena 图像中的叠加位置,得到Lena 叠加 CVlogo 的图像。
算法原理:
例程:1.90 基于图像分割的图像融合
通过图像分割,获得前景目标的掩模图像 mask,将前景图像叠加到背景图像的指定位置,直接进行图像拼接。
# 1.90:基于图像分割的图像融合
img1 = cv2.imread("../images/seaside02.png") # 背景图像
img2 = cv2.imread("../images/seagull01.png") # 添加的前景图像
xmin, ymin, w, h = 160, 64, 256, 256 # 矩形 ROI 位置: (ymin:ymin+h, xmin:xmin+w)
print(img1.shape, img2.shape)
levels = 3
# HSV 色彩空间图像分割
hsv = cv2.cvtColor(img2, cv2.COLOR_BGR2HSV) # 将图片转换到 HSV 色彩空间
lowerColor = np.array([100, 43, 46]) # 蓝色阈值下限: 100/43/46
upperColor = np.array([124, 255, 255]) # 蓝色阈值上限: 蓝色124/255/255
binary = cv2.inRange(hsv, lowerColor, upperColor) # 背景色彩图像分割
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)) # (5, 5) 结构元
dilate = cv2.dilate(cv2.bitwise_not(binary), kernel=kernel, iterations=2) # 图像膨胀
segment = cv2.bitwise_and(img2, img2, mask=dilate) # 前景分割图像,前景以外区域黑色
# 调整尺寸,将背景图片调整到 power(2,levels) 的整数倍
imgBack = cv2.resize(img1, (512, 512), interpolation=cv2.INTER_CUBIC)
front = cv2.resize(segment, (w, h)) # 将前景图像调整到指定大小 (w,h)
imgFront = np.zeros(imgBack.shape, dtype=np.uint8) # 与 imgback 尺寸相同的黑色图像
imgFront[ymin:ymin+h, xmin:xmin+w] = front
grayFront = cv2.cvtColor(imgFront, cv2.COLOR_BGR2GRAY)
_, mask0 = cv2.threshold(grayFront, 1, 255, cv2.THRESH_BINARY_INV) # 二值化处理
bg = cv2.bitwise_and(imgBack, imgBack, mask=mask0) # 生成背景,mask 遮罩区域黑色
fg = imgFront # 生成前景,前景以外区域黑色
stack = cv2.add(bg, fg) # 直接合成前景与背景
plt.figure(figsize=(9, 6))
plt.subplot(231), plt.axis('off'), plt.title("Original back")
plt.imshow(cv2.cvtColor(img1, cv2.COLOR_BGR2RGB))
plt.subplot(232), plt.axis('off'), plt.title("Original front")
plt.imshow(cv2.cvtColor(img2, cv2.COLOR_BGR2RGB))
plt.subplot(233), plt.axis('off'), plt.title("Segmentation ")
plt.imshow(cv2.cvtColor(segment, cv2.COLOR_BGR2RGB))
plt.subplot(234), plt.axis('off'), plt.title("Resized mask")
plt.imshow(mask0, "gray")
plt.subplot(235), plt.axis('off'), plt.title("Resized front")
plt.imshow(cv2.cvtColor(imgFront, cv2.COLOR_BGR2RGB))
plt.subplot(236), plt.axis('off'), plt.title("Stacked")
plt.imshow(cv2.cvtColor(stack, cv2.COLOR_BGR2RGB))
plt.tight_layout()
plt.show()
(本节完)
版权声明:
OpenCV 例程200篇 总目录-202205更新
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/124945141)
Copyright 2022 youcans, XUPT
Crated:2022-5-20
开发者涨薪指南 48位大咖的思考法则、工作方式、逻辑体系欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中【youcans 的 OpenCV 例程200篇】147. 图像分割之孤立点检测
【youcans 的 OpenCV 例程200篇】148. 图像分割之线检测
【youcans 的 OpenCV 例程200篇】149. 图像分割之边缘模型
【youcans 的 OpenCV 例程200篇】150. 边缘检测梯度算子
【youcans 的 OpenCV 例程200篇】151. 边缘检测中的平滑处理
【youcans 的 OpenCV 例程200篇】152. 边缘检测之 LoG 算子
【youcans 的 OpenCV 例程200篇】153. 边缘检测之 DoG 算子
【youcans 的 OpenCV 例程200篇】154. 边缘检测之 Canny 算子
【youcans 的 OpenCV 例程200篇】155. 边缘连接的局部处理方法
【youcans 的 OpenCV 例程200篇】156. 边缘连接局部处理的简化算法
【youcans 的 OpenCV 例程200篇】157. 霍夫变换直线检测
【youcans 的 OpenCV 例程200篇】158. 阈值处理之固定阈值法
【youcans 的 OpenCV 例程200篇】159. 图像分割之全局阈值处理
【youcans 的 OpenCV 例程200篇】160. 图像处理之OTSU 方法
【youcans 的 OpenCV 例程200篇】161. OTSU 阈值处理算法的实现
【youcans 的 OpenCV 例程200篇】162. 全局阈值处理改进方法
【youcans 的 OpenCV 例程200篇】163. 基于边缘信息改进全局阈值处理
【youcans 的 OpenCV 例程200篇】164.使用 Laplace 边缘信息改进全局阈值处理
【youcans 的 OpenCV 例程200篇】165.多阈值 OTSU 处理方法
【youcans 的 OpenCV 例程200篇】166.自适应阈值处理
【youcans 的 OpenCV 例程200篇】167.基于移动平均的可变阈值处理
【youcans 的 OpenCV 例程200篇】168.图像分割之区域生长
【youcans 的 OpenCV 例程200篇】169.图像分割之区域分离
【youcans 的 OpenCV 例程200篇】170.图像分割之K均值聚类
【youcans 的 OpenCV 例程200篇】171.SLIC 超像素区域分割
【youcans 的 OpenCV 例程200篇】172.SLIC 超像素区域分割算法比较
【youcans 的 OpenCV 例程200篇】173.SEEDS 超像素区域分割
【youcans 的 OpenCV 例程200篇】174.LSC 超像素区域分割
【youcans 的 OpenCV 例程200篇】175.超像素区域分割方法比较
【youcans 的 OpenCV 例程200篇】176.图像分割之均值漂移算法
【youcans 的 OpenCV 例程200篇】177.图像分割之 GraphCuts 图割法
【youcans 的 OpenCV 例程200篇】178.图像分割之 GrabCut 图割法(框选前景)
【youcans 的 OpenCV 例程200篇】179.图像分割之 GrabCut 图割法(掩模图像)
【youcans 的 OpenCV 例程200篇】180.基于距离变换的分水岭算法
【youcans 的 OpenCV 例程200篇】181.基于 Sobel 梯度的分水岭算法
【youcans 的 OpenCV 例程200篇】182.基于形态学梯度的分水岭算法
【youcans 的 OpenCV 例程200篇】183.基于轮廓标记的分水岭算法
【youcans 的 OpenCV 例程200篇】184.鼠标交互标记的分水岭算法
【youcans 的 OpenCV 例程200篇】185.图像金字塔之高斯金字塔
【youcans 的 OpenCV 例程200篇】186.图像金字塔之拉普拉斯金字塔
【youcans 的 OpenCV 例程200篇】187.由拉普拉斯金字塔还原图像
【youcans 的 OpenCV 例程200篇】188.基于拉普拉斯金字塔的图像融合
【youcans 的 OpenCV 例程200篇】189.基于掩模的拉普拉斯金字塔图像融合
【youcans 的 OpenCV 例程200篇】190.基于图像分割的图像融合
以上是关于youcans 的 OpenCV 例程200篇190.基于图像分割的图像融合的主要内容,如果未能解决你的问题,请参考以下文章
youcans 的 OpenCV 例程200篇183.基于轮廓标记的分水岭算法
youcans 的 OpenCV 例程200篇182.基于形态学梯度的分水岭算法