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

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

一、前言

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

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

基于轮廓提取的 图像填充法_第3张图片

二、解决方案

1、轮廓提取的方案

采用CVPR2021开源的pidinet项目
基于轮廓提取的 图像填充法_第4张图片基于轮廓提取的 图像填充法_第5张图片
总体识别效果,我经过试毒还算可以,配好环境后,在配下参数与新建一个文件放图片,就可以了
算是印象比较好的项目,很人性

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()

你可能感兴趣的:(oepncv,计算机视觉,opencv,python)