1.图片修复
用opencv实现图片修复 基本原理在于: 我们自己标定噪声的特征,然后根据噪声周围区域的颜色特征修复噪声所在的区域
有句话说的很贴切 忘了在哪听的了:
用邻近的像素替换那些坏标记,使其看起来像是邻居
比如这位
要去除这个白框框 主要步骤:
(1)标定噪声特征
先分析白色框框特征,白色区域的值大概处于[240, 240, 240]~[255, 255, 255]之间 图片中其他区域很少有这么高的像素值 所以我们可以把这个白色区域提取出来 表示为前景区域 然后对其膨胀
opencv给我们提供了一个api ,用cv2.inRange进行二值化处理,cv2.inRange 用法如下
把 low-up之间的值变为255 以外的值变成0 (跟大津法阈值不同)
结果如下:(把灯也当做噪点了)
(2)扩展噪声区域 优化处理效果
cv2.dliate
(3)图像修复
直接用opencv的api cv2.inpaint函数 用法如下:
就是在原图基础上 把mask中前景区域部分的图像根据 flags指定的方法 进行修复
结果:
再试一个:
总的来说 这玩意主要是靠opencv里面cv2.inpaint这个函数实现
一句话 对于这个白色框框: 找到它 干掉它!
(4)代码
代码如下
# 图片修复
import cv2
import numpy as np
path = "./6t.jpg"
img = cv2.imread(path)
hight, width, depth = img.shape[0:3]
# 图片二值化处理,把[240, 240, 240]~[255, 255, 255]以外的颜色变成0
thresh = cv2.inRange(img, np.array([240, 240, 240]), np.array([255, 255, 255]))
cv2.imshow("2", thresh)
# 创建形状和尺寸的结构元素
kernel = np.ones((5, 5), np.uint8)
# 扩张待修复区域
# dliate参数:原图 内核 腐蚀次数
hi_mask = cv2.dilate(thresh, kernel, iterations=1)
cv2.imshow("3", hi_mask)
# inpaint
specular = cv2.inpaint(img, hi_mask, 5, flags=cv2.INPAINT_TELEA)
cv2.namedWindow("Image", 0)
cv2.imshow("Image", img)
cv2.namedWindow("newImage", 0)
cv2.imshow("newImage", specular)
cv2.waitKey(0)
cv2.destroyAllWindows()
一看到这 我就想起来各位男同胞们心心念念的马赛克技术
我这个代码去不掉马赛克 因为马赛克区域的RGB值 不是240-255之间
马赛克待我研究研究再说
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。