基于轮廓提取的 图像填充法
一、前言
在设计裸眼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()