C++ OpenCV实现图像修复功能

目录
  • 前言
  • 一、OpenCV inpaint
  • 二、源码
  • 三、效果显示

前言

本文将使用OpenCV C++ 对有瑕疵的图像进行修复。OpenCV 提供了inpaint API可进行图像修复。

一、OpenCV inpaint

原图如图所示。本案例的需求是希望能够将图像上的红线给消除。OpenCV 提供的inpaint API能够实现这个效果。

void inpaint(

InputArray src, 原图

InputArray inpaintMask, 二进制掩模,指示要修复的像素

OutputArray dst, 目标图像

double inpaintRadius, 像素周围的邻域补绘。通常,如果要修复的区域很小,则使用较小的值仅产生较少模糊

int flags INPAINT_NS 或 INPAINT_TELEA

)

使用这个API最重要的就是生成一张二进制掩模图像(要修复的地方)。我们可以使用鼠标响应事件完成。

	//使用鼠标响应事件在 inpaintMask 绘制掩模,用于图片修复
	if (event == EVENT_LBUTTONUP || !(flags & EVENT_FLAG_LBUTTON))
	{
		prevPt = Point(-1, -1);
	}
	else if (event == EVENT_LBUTTONDOWN)
	{
		prevPt = Point(x, y);
	}
	else if (event == EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON))
	{
		prevPt = Point(x, y);
		//绘制掩模图像
		circle(inpaintMask, prevPt, 2, Scalar::all(255), -1);
		//imshow("inpaintMask", inpaintMask);

		//图像修复
		Mat result;
		inpaint(src, inpaintMask, result, 1, INPAINT_NS);
		//imshow("image", result);
	}

如图为掩模图像,接下来使用inpaint就可以对图像进行修复了。

二、源码

#include <iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/photo.hpp>
using namespace cv;
using namespace std;

/*
void inpaint(
		InputArray src,   原图
		InputArray inpaintMask, 二进制掩模,指示要修复的像素
		OutputArray dst,  目标图像
		double inpaintRadius, 像素周围的邻域补绘。通常,如果要修复的区域很小,则使用较小的值仅产生较少模糊
		int flags     INPAINT_NS  或 INPAINT_TELEA
		)
*/

Mat src, inpaintMask;
Point prevPt(-1, -1);

static void onMouse(int event, int x, int y, int flags, void*)
{
	//使用鼠标响应事件在 inpaintMask 绘制掩模,用于图片修复
	if (event == EVENT_LBUTTONUP || !(flags & EVENT_FLAG_LBUTTON))
	{
		prevPt = Point(-1, -1);
	}
	else if (event == EVENT_LBUTTONDOWN)
	{
		prevPt = Point(x, y);
	}
	else if (event == EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON))
	{
		prevPt = Point(x, y);

		//绘制掩模图像
		circle(inpaintMask, prevPt, 2, Scalar::all(255), -1);
		//imshow("inpaintMask", inpaintMask);

		//图像修复
		Mat result;
		inpaint(src, inpaintMask, result, 1, INPAINT_NS);
		//imshow("image", result);
	}
}

int main()
{
	src = imread("girl.jpg");

	if (src.empty())
	{
		cout << "No Image!" << endl;
		system("pause");
		return -1;
	}

	namedWindow("image", WINDOW_AUTOSIZE);
	imshow("image", src);

	inpaintMask = Mat::zeros(src.size(), CV_8U);  //二进制掩模,指示要修复的像素
	setMouseCallback("image", onMouse, NULL);

	waitKey(0);
	destroyAllWindows();
	system("pause");
	return 0;
}

三、效果显示

如图为使用inpaint修复的效果,可以看出基本上将瑕疵都给去掉了。

到此这篇关于C++ OpenCV实现图像修复功能的文章就介绍到这了,更多相关C++ OpenCV图像修复内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • OpenCV图像修复cv2.inpaint()的使用

    目录 1. 效果图 2. 原理 3. 源码 这篇博客将介绍如何通过OpenCV中图像修复的技术--cv2.inpaint() 去除旧照片中的小噪音.笔划等.并提供一个可交互式的程序,利用OpenCV的快速行进和流体力学俩种修复算法对自己的图片进行修复. 大多数人家里都会有一些旧的老化照片,上面有一些黑点.笔划等.如何复原呢? 在绘制工具中擦除:将简单地用无用的白色结构替换黑色结构,效果并不理想.OpenCV中图像修复的技术--基本思想很简单:用相邻像素替换这些坏标记,使其看起来像邻居. cv2.

  • Android基于OpenCV实现图像修复

    目录 API 操作 图像修复 实际应用中,图像常常容易受损,如存在污渍的镜头.旧照片的划痕.人为的涂画(比如马赛克),亦或是图像本身的损坏.将受到损坏的图像尽可能还原成原来的模样的技术,称之为图像修复.所谓修复,就代表图像大部分内容是完好的,所以,图像修复的原理,就是用完好的部分去推断受损部分的信息,特别是完好部分与受损部分的交界处,即受损区域的边缘,在这个推断过程中尤为重要. OpenCV给我们提供了inpaint方法来实现这个功能,并提供了两种图像修复的算法: 基于Navier-Stokes

  • C++实现PatchMatch图像修复算法

    PatchMatch算法出自Barnes的论文 PatchMatch: A Randomized Correspondence Algorithm for Structural Image Editing PatchMatch 算法就是一个找近似最近邻(Approximate Nearest neigbhor)的方法,要比其他ANN算法快上10倍+. 将下面的图理解了,就基本理解了整个算法. 看上图时,我们以蓝色为主颜色.A代表原图像,矩形框代表待修复的patch块,要修复patch_A块就需要

  • python 用opencv实现图像修复和图像金字塔

    我们将学习如何通过一种称为修复的方法去除旧照片中的小噪音,笔画等.基本思路很简单:用相邻像素替换那些坏标记,使其看起来像邻域. cv2.inpaint() cv2.INPAINT_TELEA cv2.INPAINT_NS import numpy as np import cv2 as cv img = cv.imread('messi_2.jpg') mask = cv.imread('mask2.png',0) dst = cv.inpaint(img,mask,3,cv.INPAINT_T

  • C++ OpenCV实现图像修复功能

    目录 前言 一.OpenCV inpaint 二.源码 三.效果显示 前言 本文将使用OpenCV C++ 对有瑕疵的图像进行修复.OpenCV 提供了inpaint API可进行图像修复. 一.OpenCV inpaint 原图如图所示.本案例的需求是希望能够将图像上的红线给消除.OpenCV 提供的inpaint API能够实现这个效果. void inpaint( InputArray src, 原图 InputArray inpaintMask, 二进制掩模,指示要修复的像素 Outpu

  • C++ OpenCV实现图像去水印功能

    目录 前言 一.水印定位 二.图像修复 三.效果显示 四.源码 总结 前言 本文将使用OpenCV C++ 进行简单图像水印去除.我们在网上download图片时,经常因为版权问题有水印.本案例通过编写算法进行简单水印去除. 一.水印定位 如图所示,图像左下角.右下角有水印.第一步,我们首先得定位水印所在位置. Mat gray; cvtColor(src, gray, COLOR_BGR2GRAY); //图像二值化,筛选出白色区域部分 Mat thresh; threshold(gray,

  • OpenCV实现图像切割功能

    openCV实现将图像切成m*n块,供大家参考,具体内容如下 一.代码部分: #include "stdafx.h" #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> #include <vector> #include<string> #include<sstream> using

  • Python使用OpenCV对图像进行缩放功能

    OpenCV:图片缩放和图像金字塔 对图像进行缩放的最简单方法当然是调用resize函数啦! resize函数可以将源图像精确地转化为指定尺寸的目标图像. 要缩小图像,一般推荐使用CV_INETR_AREA来插值:若要放大图像,推荐使用CV_INTER_LINEAR. 现在说说调用方式 第一种,规定好你要图片的尺寸,就是你填入你要的图片的长和高. #include<opencv2\opencv.hpp> #include<opencv2\highgui\highgui.hpp> u

  • Python Opencv实现图像轮廓识别功能

    本文实例为大家分享了python opencv识别图像轮廓的具体代码,供大家参考,具体内容如下 要求:用矩形或者圆形框住图片中的云朵(不要求全部框出) 轮廓检测 Opencv-Python接口中使用cv2.findContours()函数来查找检测物体的轮廓. import cv2 img = cv2.imread('cloud.jpg') # 灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化 ret, binary = cv2.th

  • C++函数pyrUp和pyrDown来实现图像金字塔功能

    目标 本文档尝试解答如下问题: 如何使用OpenCV函数 pyrUp 和 pyrDown 对图像进行向上和向下采样. 原理 Note 以下内容来自于Bradski和Kaehler的大作: Learning OpenCV . 当我们需要将图像转换到另一个尺寸的时候, 有两种可能: 放大 图像 或者 缩小 图像. 尽管OpenCV 几何变换 部分提供了一个真正意义上的图像缩放函数(resize, 在以后的教程中会学到),不过在本篇我们首先学习一下使用 图像金字塔 来做图像缩放, 图像金字塔是视觉运用

  • 使用OpenCV实现仿射变换—平移功能

    当我们打开一个图片编辑软件时,基本上都会提供几个操作:平移.缩放和旋转.特别目前在手机里拍照时,由于位置传感器的失灵,也许是软件的BUG,有一次我就遇到苹果手机不管怎么样竖放,或横放,它拍摄的照片就竖不起来,后来只有关机重启才解决.这样拍摄出来的照片,如果要改变方向,只能使用编辑功能了,进行旋转.因此,几何变换的功能,在现实生活里的需求必不可少. 为了理解这个几何的问题,可以来回忆一下初中的课本内容: 从这里可以看到平移的基本性质,有了这些概念之后,就要进入解释几何,平移的表达,比如往x轴移动1

随机推荐