首页 > 编程知识 正文

opencv 图像处理,pythonopencv中文教程

时间:2023-05-03 19:34:08 阅读:33288 作者:4226

Python,OpenCV中的图像修复——cv2.inpaint 1.效果图2 .原理3 .参考源代码

image inpainting 图像修改

本博客介绍如何使用OpenCV的图像修复技术——cv2.inpaint ) )消除老照片中的小噪声和笔划等。 并给出利用OpenCV快速行走和流体力学两种修复算法修复自己图像的交互式程序。

大多数人家里都有老化照片,上面有黑点和笔画等。 怎么恢复呢?

使用绘画工具擦除:仅用无用的白色结构替换黑色结构没有效果。OpenCV中图像修复的技术——基本思想很简单:用相邻像素替换这些坏标记,使其看起来像邻居。

cv2.in paint _ telea (快速行驶算法) ) ) ) ) ) ) ) ) )。

cv2.in paint _ ns (流体动力学算法) )。

未实现opencv:http://www.Sina.com /

cv2.inpaint ()优势:修复效果更自然;

缺点:修复时需要提供原始图像和mask图像(仅在与原始图像一致的受污染像素区域中有值);

1 .效果图Content-Aware Fill 内容感知填充算法,这是Adobe Photoshop中使用的一种高级修复技术。

其次通过交互式例子实现自己的图像修复;

官方原始图 VS mask图 VS 快速行进算法修复效果 VS 流体力学修复效果 如下:

原图鼠标左键自由移动绘图点、线条,右键移动绘图矩形随机增加污染区域;

根据原始图生成掩码图。 mask图与原图大小相同,只有被污染的区域是白色像素的图。 能看到修复效果吗? ~ 原始图 VS Mask图 VS 快速行进算法修复效果图如下:

原图鼠标左键自由移动绘图点、线条,右键移动绘图矩形随机增加污染区域;

mask图与原图大小相同,只有被污染的区域是白色像素的图。 能看到修复效果吗? ~ 原始图 VS Mask图 VS 流体力学算法修复效果图如下:

2 .原理cv2.in paint _ telea (快速移位算法),给位于点附近、边界法线附近、边界轮廓上的像素更多的权重。 修复一个像素后,快速移动到下一个最近的像素。

采用cv2.in paint _ ns (流体动力学算法)、流体力学几种方法,基本原则是启发式的。 首先,它沿着边从已知区域移动到未知区域(因为边是连续的)。 继续等高线,同时与修复区域边界上的渐变向量匹配。 就像等高线连接相同高度点的线一样,是连接相同强度点的线。

未实现opencv:http://www.Sina.com /

3 .源代码#图像修复交互案例——修复被水流填充算法破坏的图像区域# cv2.in paint _ telea (快速行驶算法)使用两种方法对点附近、边界法线附近和边界轮廓上的像素进行更多加权。 修复一个像素后,快速移动到下一个最近的像素。 # cv2.INPAINT_NS流体力学算法使用了流体力学的几种方法。 基本原则是启发式的,首先沿着边从已知区域移动到未知区域。 因为边缘是连续的。 继续等高线,同时与修复区域边界上的渐变向量匹配。 就像等高线连接相同高度点的线一样,是连接相同强度点的线。 # usage # pythoninpaint.pyd :/deep learning/py-demo/2021 08/images/ml.jpg #按鼠标左键,添加点、线,鼠标右键按空格键(执行修复功能)按r键(重置要修复的mask# )按esc键,然后按import c v2 importnumpyasnpclassketcher 3360 def _ _ init _ (设置退出winit_ )的colors_func ) : self.prev_pt=None #线起点self.drag_start=None #矩形起点self.drag_rect=None #

unc = colors_func self.dirty = False self.drawing = False self.mode = False self.show() cv2.setMouseCallback(self.windowname, self.on_mouse) def show(self): cv2.imshow(self.windowname, self.dests[0]) def on_mouse(self, event, x, y, flags, param): pt = (x, y) if event == cv2.EVENT_LBUTTONDOWN: self.prev_pt = pt self.drawing = True elif event == cv2.EVENT_RBUTTONDOWN: # 第一次初始化时设定pt,往后保留上一个点作为矩形起点 if self.drag_start == None: self.drag_start = pt if self.prev_pt and flags & cv2.EVENT_FLAG_LBUTTON: for dst, color in zip(self.dests, self.colors_func()): cv2.line(dst, self.prev_pt, pt, color, 5) self.dirty = True self.prev_pt = pt self.show() if self.drag_start and flags & cv2.EVENT_FLAG_RBUTTON: xo, yo = self.drag_start x0, y0 = np.minimum([xo, yo], [x, y]) x1, y1 = np.maximum([xo, yo], [x, y]) self.drag_rect = None if x1 - x0 > 0 and y1 - y0 > 0: self.drag_rect = (x0, y0, x1, y1) for dst, color in zip(self.dests, self.colors_func()): cv2.rectangle(dst, (x0, y0), (x1, y1), color, -1) self.dirty = True self.drag_start = None self.drag_rect = None self.show() else: self.drag_start = pt @property def dragging(self): return self.drag_rect is not Nonedef main(): import sys try: fn = sys.argv[1] except: fn = 'images/ml_.jpg' img = cv2.imread(fn) if img is None: print('Failed to load image file:', fn) sys.exit(1) img_粗犷的冬天 = img.copy() 粗犷的冬天 = np.zeros(img.shape[:2], np.uint8) sketch = Sketcher('img', [img_粗犷的冬天, 粗犷的冬天], lambda: ((255, 255, 255), 255)) while True: ch = cv2.waitKey() if ch == 27: break if ch == ord(' '): cv2.imshow('mask', 粗犷的冬天) fmmres = cv2.inpaint(img_粗犷的冬天, 粗犷的冬天, 3, cv2.INPAINT_TELEA) nsres = cv2.inpaint(img_粗犷的冬天, 粗犷的冬天, 3, cv2.INPAINT_NS) cv2.imshow('inpaint fmm res', fmmres) cv2.imshow('inpaint ns res', nsres) if ch == ord('r'): img_粗犷的冬天[:] = img 粗犷的冬天[:] = 0 sketch.show() print('Done')if __name__ == '__main__': main() cv2.destroyAllWindows() 参考 https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_photo/py_inpainting/py_inpainting.html#inpainting

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。