OpenCV笔记3-图像修复
图像修复图像修复是计算机视觉中的一类算法,其目标是添补图像或视频内的区域。该区域利用二进制掩模举行标识,添补通常根据需要添补的区域界限信息来完成。图像修复的最常见应用是规复旧的扫描照片。图像修复不但可以去除图像中得“划痕”,它还用于删除图像中的小的不需要的对象(去除图像中得水印、日期等)。
OpenCV 实现了两种修复算法:
[*]“一种基于快速行进法的图像修复技能”,Alexandru Telea,2004: 这是基于快速行进法(FMM)。检察要修复的区域,该算法首先从界限像素开始,然后到达界限内的像素。它用背景中像素的加权和替换每个要修复的像素,将更多的权重赋予更近的像素和界限像素。
[*]“纳维尔-斯托克斯,流体动力学,图像和视频修复”,贝尔塔米奥,马塞洛,安德里亚·l·贝尔托齐和吉列尔莫·萨皮罗,2001: 该算法受偏微分方程的启发。从边沿(已知区域)开始向未知区域流传等照度线(毗连同强度点的线)。最后,区域中的变革被最小化以添补颜色。
Image Inpainting with OpenCV (C++/Python) | LearnOpenCV #
理论可以看看这篇。
dst = cv2.inpaint(src, inpaintMask, inpaintRadius, flags)来实现修复图像,
参数寄义:
src:源图像,也就是需要修复的图像
inpaintMask:二进制掩码,指示要修复的像素。
dst:结果图像
inpaintRadius:表示修复的半径
flags : 修复算法
import cv2
import rclpy
from rclpy.node import Node
import numpy as np
from ament_index_python.packages import get_package_share_directory #获取shares目录绝对路径
class OpenCVNode(Node):
def readImg(self,img_name: str):
default_image_path = get_package_share_directory('yahboom_esp32ai_car')+'/resource/'
self.get_logger().info(f'打开图片:{default_image_path}')
dam_img = cv2.imread(default_image_path+img_name)
#mask =np.zeros((height,width,1),np.uint8)
#灰度
gray = cv2.cvtColor(dam_img,cv2.COLOR_BGR2GRAY)
#2值化
_,mask = cv2.threshold(gray,150,255,cv2.THRESH_BINARY_INV)
#
# kernel_3X3 = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))#构造卷积核
# mask_after_open = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel_3X3)#形态学
dst_fmm = cv2.inpaint(src=dam_img, inpaintMask=mask, inpaintRadius=3, flags=cv2.INPAINT_TELEA)
dst_ns = cv2.inpaint(dam_img,mask,10,cv2.INPAINT_NS)
cv2.imshow('dam_img',dam_img)
cv2.imshow('paint',mask)
cv2.imshow('Inpaint Output using FMM', dst_fmm)
cv2.imshow('Inpaint Output using ns',dst_ns)
cv2.waitKey(0)
def main():
rclpy.init()
node = OpenCVNode('opencvNode')
node.readImg('d3.jpg')
rclpy.spin(node)
rclpy.shutdown() 我本身测试了下,关键是掩模的天生,算法结果区别不大。简单图像对比明显的结果好,背景复杂的干扰项结果较差。结果好的:
https://i-blog.csdnimg.cn/direct/0a8ddaf32deb45dea86e3f285afff13f.png
https://i-blog.csdnimg.cn/direct/72d1c282db2549979d10bba455ef9d3b.png
结果欠好的修复
https://i-blog.csdnimg.cn/direct/1196be9d82f54cc08f08390795e86830.png
图片亮度增强
简单来说就是调解rgb的值。可以看看大佬们写的专业分析
8、OpenCV调解图像对比度和亮度_照片对比度csdn-CSDN博客
import cv2
import rclpy
from rclpy.node import Node
import numpy as np
import math
from ament_index_python.packages import get_package_share_directory #获取shares目录绝对路径
class OpenCVNode(Node):
def readImg(self,img_name: str):
default_image_path = get_package_share_directory('yahboom_esp32ai_car')+'/resource/'
self.get_logger().info(f'打开图片:{default_image_path}')
img = cv2.imread(default_image_path+img_name)
gamma_val = 0.5
#gamma
gamma_table = # 建立映射表
gamma_table = np.round(np.array(gamma_table)).astype(np.uint8)# 颜色值为整数
img_gamma = cv2.LUT(img, gamma_table)# 图片颜色查表。另外可以根据光强(颜色)均匀化原则设计自适应算法。
#
cv2.imshow('img',img)
cv2.imshow('img_gamma',img_gamma)
cv2.waitKey(0)
def main():
rclpy.init()
node = OpenCVNode('opencvNode')
node.readImg('20.jpg')
rclpy.spin(node)
rclpy.shutdown() 固然这里还有很多细节参数的,直接调解过大,图片处置处罚欠好容易过曝。
结果如下:
https://i-blog.csdnimg.cn/direct/e8fa41aef70a4541a6539206bbc5ef9a.png
图片磨皮
磨皮算法的焦点就是让皮肤区域的像素变得平滑,过渡自然,让皮肤看起来十分光滑。
我大概在网上搜了下,结果好一些的大佬重要包罗了两部分:滤波算法、皮肤区域检测、肤色提取等。这个比较复杂,由于不加区域的话,过滤完图片很多细节会丢失,所以需要指定区域去美化结果才好。
这里就先测试下opencv的单个函数,没有深入学习。简单相识下:双边滤波(Bilateral filter) 是一种非线性的滤波方法,是联合图像的空间邻近度和像素值相似度的一种折中处置处罚,同时考虑空域信息和灰度相似性,达到保边去噪的目标。具有简单、非迭代、局部的特点。双边滤波长处:对边沿信息有较好的保留,缺点:不能较好的消除噪声
推荐几个大佬写的,可以对比下大佬的结果:
https://zhuanlan.zhihu.com/p/407017507 这篇讲理论
人脸磨皮_cv 磨皮算法-CSDN博客
我的这个磨皮测试图片也是用的这个,明显照旧大佬的专业,结果好,推荐各人看看。
void bilateralFilter( InputArray src,
OutputArray dst,
int d,
double sigmaColor,
double sigmaSpace,
int borderType = BORDER_DEFAULT );
参数:
[*]第一个参数,InputArray范例的src,输入图像,即源图像,需要为8位或者浮点型单通道、三通道的图像。
[*]第二个参数,OutputArray范例的dst,即目标图像,需要和源图片有一样的尺寸和范例。
[*]第三个参数,int范例的d,表示在过滤过程中每个像素邻域的直径。如果这个值我们设其为非正数,那么OpenCV会从第五个参数sigmaSpace来计算出它来。
[*]第四个参数,double范例的sigmaColor,颜色空间滤波器的sigma
[*]。这个参数的值越大,就表明该像素邻域内有更宽广的颜色会被混淆到一起,产生较大的半相当颜色区域。
[*]第五个参数,double范例的sigmaSpace坐标空间中滤波器的sigma值,坐标空间的标注方差。他的数值越大,意味着越远的像素会相互影响,从而使更大的区域充足相似的颜色获取相同的颜色。当d>0,d指定了邻域大小且与sigmaSpace无关。否则,d正比于sigmaSpace。
[*]第六个参数,int范例的borderType,用于推断图像外部像素的某种界限模式。注意它有默认值BORDER_DEFAULT。
import cv2
import rclpy
from rclpy.node import Node
import numpy as np
import math
from ament_index_python.packages import get_package_share_directory #获取shares目录绝对路径
class OpenCVNode(Node):
def readImg(self,img_name: str):
default_image_path = get_package_share_directory('yahboom_esp32ai_car')+'/resource/'
self.get_logger().info(f'打开图片:{default_image_path}')
img = cv2.imread(default_image_path+img_name)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 进行离散傅里叶变换
#dft = cv2.dft(np.float32(gray), flags=cv2.DFT_COMPLEX_OUTPUT)
kernel = np.ones((3,3),np.float32)
kernel = kernel/9.
# 使用高斯滤波器对频域图像进行滤波
#blurred = cv2.GaussianBlur(img, (3, 3), 0)
smoothed = cv2.bilateralFilter(img, 10, 30, 30)
cv2.imshow('img',img)
cv2.imshow('smoothed',smoothed)
cv2.waitKey(0)
def main():
rclpy.init()
node = OpenCVNode('opencvNode')
node.readImg('9.jpg')
rclpy.spin(node)
rclpy.shutdown() 结果如下:
https://i-blog.csdnimg.cn/direct/b014bb0523d445c093953a3fa917927d.png
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]