IT评测·应用市场-qidao123.com技术社区

标题: OpenCV笔记3-图像修复 [打印本页]

作者: 羊蹓狼    时间: 2025-1-22 04:11
标题: OpenCV笔记3-图像修复
图像修复

图像修复是计算机视觉中的一类算法,其目标是添补图像或视频内的区域。该区域利用二进制掩模举行标识,添补通常根据需要添补的区域界限信息来完成。图像修复的最常见应用是规复旧的扫描照片。图像修复不但可以去除图像中得“划痕”,它还用于删除图像中的小的不需要的对象(去除图像中得水印、日期等)。
OpenCV 实现了两种修复算法:
Image Inpainting with OpenCV (C++/Python) | LearnOpenCV # 
理论可以看看这篇。
dst = cv2.inpaint(src, inpaintMask, inpaintRadius, flags)来实现修复图像,
参数寄义:
src:源图像,也就是需要修复的图像
inpaintMask:二进制掩码,指示要修复的像素。
dst:结果图像
inpaintRadius:表示修复的半径
flags : 修复算法
  1. import cv2
  2. import rclpy
  3. from rclpy.node import Node
  4. import numpy as np
  5. from ament_index_python.packages import get_package_share_directory #获取shares目录绝对路径
  6. class OpenCVNode(Node):
  7.     def readImg(self,img_name: str):
  8.         default_image_path = get_package_share_directory('yahboom_esp32ai_car')+'/resource/'
  9.         self.get_logger().info(f'打开图片:{default_image_path}')
  10.         dam_img = cv2.imread(default_image_path+img_name)
  11.         #mask =  np.zeros((height,width,1),np.uint8)
  12.         #灰度
  13.         gray = cv2.cvtColor(dam_img,cv2.COLOR_BGR2GRAY)
  14.         #2值化
  15.         _,mask = cv2.threshold(gray,150,255,cv2.THRESH_BINARY_INV)
  16.         #
  17.         # kernel_3X3 = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))#构造卷积核
  18.         # mask_after_open = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel_3X3)#形态学  
  19.         dst_fmm = cv2.inpaint(src=dam_img, inpaintMask=mask, inpaintRadius=3, flags=cv2.INPAINT_TELEA)
  20.         dst_ns = cv2.inpaint(dam_img,mask,10,cv2.INPAINT_NS)
  21.         cv2.imshow('dam_img',dam_img)
  22.         cv2.imshow('paint',mask)
  23.         cv2.imshow('Inpaint Output using FMM', dst_fmm)
  24.         cv2.imshow('Inpaint Output using ns',dst_ns)
  25.    
  26.         cv2.waitKey(0)
  27. def main():
  28.     rclpy.init()
  29.     node = OpenCVNode('opencvNode')
  30.     node.readImg('d3.jpg')
  31.     rclpy.spin(node)
  32.     rclpy.shutdown()
复制代码
我本身测试了下,关键是掩模的天生,算法结果区别不大。简单图像对比明显的结果好,背景复杂的干扰项结果较差。结果好的:


结果欠好的修复

图片亮度增强

简单来说就是调解rgb的值。可以看看大佬们写的专业分析
8、OpenCV调解图像对比度和亮度_照片对比度csdn-CSDN博客
  1. import cv2
  2. import rclpy
  3. from rclpy.node import Node
  4. import numpy as np
  5. import math
  6. from ament_index_python.packages import get_package_share_directory #获取shares目录绝对路径
  7. class OpenCVNode(Node):
  8.     def readImg(self,img_name: str):
  9.         default_image_path = get_package_share_directory('yahboom_esp32ai_car')+'/resource/'
  10.         self.get_logger().info(f'打开图片:{default_image_path}')
  11.         img = cv2.imread(default_image_path+img_name)
  12.         gamma_val = 0.5
  13.         #gamma
  14.         gamma_table = [np.power(x / 255.0, gamma_val) * 255.0 for x in range(256)]  # 建立映射表
  15.         gamma_table = np.round(np.array(gamma_table)).astype(np.uint8)  # 颜色值为整数
  16.         img_gamma = cv2.LUT(img, gamma_table)  # 图片颜色查表。另外可以根据光强(颜色)均匀化原则设计自适应算法。
  17.         #
  18.         cv2.imshow('img',img)
  19.         cv2.imshow('img_gamma',img_gamma)
  20.    
  21.         cv2.waitKey(0)
  22. def main():
  23.     rclpy.init()
  24.     node = OpenCVNode('opencvNode')
  25.     node.readImg('20.jpg')
  26.     rclpy.spin(node)
  27.     rclpy.shutdown()
复制代码
固然这里还有很多细节参数的,直接调解过大,图片处置处罚欠好容易过曝。
结果如下:


图片磨皮

磨皮算法的焦点就是让皮肤区域的像素变得平滑,过渡自然,让皮肤看起来十分光滑。
我大概在网上搜了下,结果好一些的大佬重要包罗了两部分:滤波算法、皮肤区域检测、肤色提取等。这个比较复杂,由于不加区域的话,过滤完图片很多细节会丢失,所以需要指定区域去美化结果才好。
这里就先测试下opencv的单个函数,没有深入学习。简单相识下:双边滤波(Bilateral filter) 是一种非线性的滤波方法,是联合图像的空间邻近度和像素值相似度的一种折中处置处罚,同时考虑空域信息和灰度相似性,达到保边去噪的目标。具有简单、非迭代、局部的特点。双边滤波长处:对边沿信息有较好的保留,缺点:不能较好的消除噪声
推荐几个大佬写的,可以对比下大佬的结果:
https://zhuanlan.zhihu.com/p/407017507  这篇讲理论
[Opencv根本]人脸磨皮_cv 磨皮算法-CSDN博客
我的这个磨皮测试图片也是用的这个,明显照旧大佬的专业,结果好,推荐各人看看。
  1. void bilateralFilter( InputArray src,
  2.                       OutputArray dst,
  3.                       int d,
  4.                       double sigmaColor,
  5.                       double sigmaSpace,
  6.                       int borderType = BORDER_DEFAULT );
复制代码
参数:


  1. import cv2
  2. import rclpy
  3. from rclpy.node import Node
  4. import numpy as np
  5. import math
  6. from ament_index_python.packages import get_package_share_directory #获取shares目录绝对路径
  7. class OpenCVNode(Node):
  8.     def readImg(self,img_name: str):
  9.         default_image_path = get_package_share_directory('yahboom_esp32ai_car')+'/resource/'
  10.         self.get_logger().info(f'打开图片:{default_image_path}')
  11.         img = cv2.imread(default_image_path+img_name)
  12.         gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  13.        # 进行离散傅里叶变换
  14.         #dft = cv2.dft(np.float32(gray), flags=cv2.DFT_COMPLEX_OUTPUT)
  15.         kernel = np.ones((3,3),np.float32)
  16.         kernel = kernel/9.
  17.         # 使用高斯滤波器对频域图像进行滤波
  18.         #blurred = cv2.GaussianBlur(img, (3, 3), 0)
  19.         smoothed = cv2.bilateralFilter(img, 10, 30, 30)
  20.      
  21.         cv2.imshow('img',img)
  22.         cv2.imshow('smoothed',smoothed)
  23.    
  24.         cv2.waitKey(0)
  25. def main():
  26.     rclpy.init()
  27.     node = OpenCVNode('opencvNode')
  28.     node.readImg('9.jpg')
  29.     rclpy.spin(node)
  30.     rclpy.shutdown()
复制代码
 结果如下:




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4