基于轮廓提取的 图像填充法

简介: 这篇文章介绍了一种基于轮廓提取的图像填充法,使用CVPR2021开源的pidinet项目进行轮廓提取,再结合OpenCV的floodFill算法实现图像的动态填充和复原功能。

基于轮廓提取的 图像填充法

一、前言

在设计裸眼3d视频生成算法的时候涉及到了这一点,遂记录一下
版本1,效果如下:
在这里插入图片描述
设计思路:一开始想直接用水漫法填充的时候,很容易发现下面的问题,就是抹少了,或抹多了,所以我们采用先转轮廓图,然后再用水漫法进行填充的方法。
在这里插入图片描述

  • 可以看到确实是好了一些

在这里插入图片描述

二、解决方案

1、轮廓提取的方案

采用CVPR2021开源的pidinet项目
在这里插入图片描述在这里插入图片描述
总体识别效果,我经过试毒还算可以,配好环境后,在配下参数与新建一个文件放图片,就可以了
算是印象比较好的项目,很人性

2、图像填充法

我采用了Opencv floodFill算法,也就是常说的水漫填充法
然后,在加一个鼠标监听即可

3、图像填充法设计程序如下

import cv2 as cv
import numpy as np

def fill_image(image,x,y):
    copyImage = image.copy() # 复制原图像
    h, w = image.shape[:2] # 读取图像的宽高
    mask = np.zeros([h+2, w+2], np.uint8) # 新建图像矩阵  +2是官方函数要求
    #(0,80) 起始点,(0,100,255) 蓝色 ,(100,100,50)棕色 ,(50,50,50) 浅黑
    cv.floodFill(copyImage, mask, (x,y), (255, 255, 255), (100, 100, 50), (50, 50, 50), cv.FLOODFILL_FIXED_RANGE)
    cv.namedWindow("EdgeFill", cv.WINDOW_NORMAL)
    cv.imshow("EdgeFill", copyImage)
    return copyImage

def on_mouse(event,x,y,flags,param):
    global img,src
    if event==cv.EVENT_LBUTTONDOWN:
        img=fill_image(img,x,y)
    if event==cv.EVENT_RBUTTONDOWN:
        img=src.copy()
        cv.namedWindow("EdgeFill", cv.WINDOW_NORMAL)
        cv.imshow("EdgeFill", img)

def main():
    global img,src
    srcPath=input("请输入要动态填充的处理后的轮廓图片的绝对地址:")
    print("使用说明:点击左键则开始填充,点击右键则复原")
    src = cv.imread(srcPath)
    img=src.copy()
    cv.namedWindow("EdgeFill", 0)
    cv.imshow("EdgeFill", img)
    cv.setMouseCallback("EdgeFill",on_mouse)
    cv.waitKey(0)
    cv.destroyAllWindows()

if __name__=="__main__":
    main()
相关文章
|
5月前
|
存储 算法 Python
查找图像轮廓
【6月更文挑战第11天】查找图像轮廓。
58 3
|
5月前
|
计算机视觉
OpenCV图像像素值统计
OpenCV图像像素值统计
|
5月前
|
Web App开发 算法 Java
图像放缩之双线性内插值
图像放缩之双线性内插值
25 0
|
6月前
|
计算机视觉 Python
OpenCV为图像扩边(填充)
OpenCV为图像扩边(填充)
64 0
|
C++ 计算机视觉
C++-图像目标区裁剪ImageCropping
C++-图像目标区裁剪ImageCropping
|
定位技术
任意一张图片的CGCS2000坐标配准
任意一张图片的CGCS2000坐标配准
140 0
|
存储 编解码 对象存储
将图像标记器多边形转换为标记的块图像以进行语义分割
将存储在对象中的多边形标签转换为适用于语义分割工作流的标记阻止图像。 可以使用计算机视觉工具箱中的图像标记器应用来标记太大而无法放入内存和多分辨率图像的图像。有关详细信息,请参阅在图像标记器(计算机视觉工具箱)中标记大图像。图像标记器应用不支持对被阻止的图像进行像素标记。您只能使用 ROI 形状(如多边形、矩形和线条)创建标签。此示例演示如何使用函数将多边形 ROI 转换为像素标记的块图像,以进行语义分割工作流。
71 0
将图像标记器多边形转换为标记的块图像以进行语义分割
|
计算机视觉
opencv 之图像的边界填充及一些数据计算
opencv 之图像的边界填充及一些数据计算
110 0
|
API 计算机视觉 索引
OpenCV_02 图像的基本操作:图像IO+绘制图形+像素点+属性+图像通道+色彩空间的改变
注意:在调用显示图像的API后,要调用cv.waitKey()给图像绘制留下时间,否则窗口会出现无响应情况,并且图像无法显示出来。
108 0
【IMAQ】imaqSetImageSize() 设置图像大小
【IMAQ】imaqSetImageSize() 设置图像大小