using OpenCvSharp;
using System;
namespace demo
{
internal class Program
{
public static string WINDOW_NAME0 = "【原始图参考】"; //为窗口标题定义的宏
public static string WINDOW_NAME1 = "【原始图】"; //为窗口标题定义的宏
public static string WINDOW_NAME2 = "【修补后的效果图】"; //为窗口标题定义的宏
public static Mat srcImage = new Mat();
public static Mat srcImage0 = new Mat();
public static Mat srcImage1 = new Mat();
public static Mat inpaintMask = new Mat();
public static Point previousPoint = new Point(-1, -1);
public static void on_Mouse(MouseEventTypes @event, int x, int y, MouseEventFlags flags, IntPtr userData)
{
//处理鼠标左键相关消息
if (@event == MouseEventTypes.LButtonUp || ((int)flags & (int)MouseEventFlags.LButton) == 0)
previousPoint = new Point(-1, -1);
else if (@event == MouseEventTypes.LButtonDown)
previousPoint = new Point(x, y);
//鼠标左键按下并移动,绘制出白色线条
else if (@event == MouseEventTypes.MouseMove && ((int)flags & (int)MouseEventFlags.LButton) > 0)
{
Point pt = new Point(x, y);
if (previousPoint.X < 0)
previousPoint = pt;
Cv2.Line(inpaintMask, previousPoint, pt, new Scalar(255, 255, 255), 5, LineTypes.Link8, 0);
Cv2.Line(srcImage1, previousPoint, pt, new Scalar(255, 255, 255), 5, LineTypes.Link8, 0);
previousPoint = pt;
Cv2.ImShow(WINDOW_NAME1, srcImage1);
}
}
static void Main(string[] args)
{
// 载入原图
srcImage = Cv2.ImRead("../../../images/Astral2.jpg");
if (srcImage.Empty())
{
Console.WriteLine("Could not open or find the image!");
return;
}
srcImage.CopyTo(srcImage0);
srcImage.CopyTo(srcImage1);
inpaintMask = new Mat(srcImage1.Size(), MatType.CV_8U);
//显示原始图参考
Cv2.ImShow(WINDOW_NAME0, srcImage0);
//显示原始图
Cv2.ImShow(WINDOW_NAME1, srcImage1);
// 设置鼠标回调消息
Cv2.SetMouseCallback(WINDOW_NAME1, new MouseCallback(on_Mouse));
RNG rng = new RNG(12345);
while (true)
{
//获取键值
int c = Cv2.WaitKey(0);
//按键键值为2时,恢复源图
if ((char)c == '2')
{
inpaintMask = new Mat(inpaintMask.Size(), inpaintMask.Type());
srcImage.CopyTo(srcImage1);
Cv2.ImShow(WINDOW_NAME1, srcImage1);
}
//若检测到按键值为1或者空格,则进行处理
if ((char)c == '1' || (char)c == ' ')
{
Mat inpaintedImage = new Mat();
Cv2.Inpaint(srcImage1, inpaintMask, inpaintedImage, 3, InpaintMethod.Telea);
Cv2.ImShow(WINDOW_NAME2, inpaintedImage);
inpaintedImage.Dispose();
}
}
}
}
}
C++版本代码如下:
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/photo/photo.hpp"
#include <iostream>
using namespace cv;
using namespace std;
#define WINDOW_NAME0 "【原始图参考】" //为窗口标题定义的宏
#define WINDOW_NAME1 "【原始图】" //为窗口标题定义的宏
#define WINDOW_NAME2 "【修补后的效果图】" //为窗口标题定义的宏
Mat srcImage0, srcImage1, inpaintMask;
Point previousPoint(-1, -1);//原来的点坐标
static void ShowHelpText()
{
//输出一些帮助信息
printf("\n\n\n\t欢迎来到【图像修复】示例程序~\n");
printf("\n\t请在进行图像修复操作之前,在【原始图】窗口中进行适量的绘制"
"\n\n\t按键操作说明: \n\n"
"\t\t【鼠标左键】-在图像上绘制白色线条\n\n"
"\t\t键盘按键【ESC】- 退出程序\n\n"
"\t\t键盘按键【1】或【SPACE】-进行图像修复操作 \n\n");
}
static void On_Mouse(int event, int x, int y, int flags, void*)
{
//鼠标左键弹起消息
if (event == EVENT_LBUTTONUP || !(flags & EVENT_FLAG_LBUTTON))
previousPoint = Point(-1, -1);
//鼠标左键按下消息
else if (event == EVENT_LBUTTONDOWN)
previousPoint = Point(x, y);
//鼠标按下并移动,进行绘制
else if (event == EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON))
{
Point pt(x, y);
if (previousPoint.x < 0)
previousPoint = pt;
//绘制白色线条
line(inpaintMask, previousPoint, pt, Scalar::all(255), 5, 8, 0);
line(srcImage1, previousPoint, pt, Scalar::all(255), 5, 8, 0);
previousPoint = pt;
imshow(WINDOW_NAME1, srcImage1);
}
}
int main(int argc, char** argv)
{
//改变console字体颜色
system("color 2F");
//显示帮助文字
ShowHelpText();
//载入原始图并进行掩膜的初始化
Mat srcImage = imread("../images/Astral2.jpg", -1);
if (!srcImage.data)
{
printf("读取图片错误,请确定目录下是否有imread函数指定图片存在~! \n");
return false;
}
srcImage0 = srcImage.clone();
srcImage1 = srcImage.clone();
inpaintMask = Mat::zeros(srcImage1.size(), CV_8U);
//显示原始图参考
imshow(WINDOW_NAME0, srcImage0);
//显示原始图
imshow(WINDOW_NAME1, srcImage1);
//设置鼠标回调消息
setMouseCallback(WINDOW_NAME1, On_Mouse, 0);
//轮询按键,根据不同的按键进行处理
while (1)
{
//获取按键键值
char c = (char)waitKey();
//键值为ESC,程序退出
if (c == 27)
break;
//键值为2,恢复成原始图像
if (c == '2')
{
inpaintMask = Scalar::all(0);
srcImage.copyTo(srcImage1);
imshow(WINDOW_NAME1, srcImage1);
}
//键值为1或者空格,进行图像修补操作
if (c == '1' || c == ' ')
{
Mat inpaintedImage;
inpaint(srcImage1, inpaintMask, inpaintedImage, 3, INPAINT_TELEA);
imshow(WINDOW_NAME2, inpaintedImage);
}
}
return 0;
}
Python版本代码如下:
import cv2
import numpy as np
WINDOW_NAME0="WINDOW_NAME0"
WINDOW_NAME1="WINDOW_NAME1"
WINDOW_NAME2="WINDOW_NAME2"
previousPoint = (-1,-1)
def onMouse(event, x, y, flags, param):
global srcImage1,inpaintMask,previousPoint
# 处理鼠标左键相关消息
if event == cv2.EVENT_LBUTTONUP or flags & cv2.EVENT_FLAG_LBUTTON <= 0:
previousPoint = (-1, -1)
elif event == cv2.EVENT_LBUTTONDOWN:
previousPoint = (x, y)
# 鼠标左键按下并移动,绘制出白色线条
elif event == cv2.EVENT_MOUSEMOVE or flags & cv2.EVENT_FLAG_LBUTTON > 0:
pt = (x,y)
if previousPoint[0] < 0:
previousPoint = pt
cv2.line(inpaintMask, previousPoint, pt, (255, 255, 255), 5, 8, 0)
cv2.line(srcImage1, previousPoint, pt, (255, 255, 255), 5, 8, 0)
previousPoint = pt
cv2.imshow(WINDOW_NAME1, srcImage1)
# 载入原图
srcImage=cv2.imread('../images/Astral2.jpg')
srcImage0=srcImage.copy()
srcImage1=srcImage.copy()
inpaintMask = np.zeros((srcImage1.shape[0], srcImage1.shape[1], 3), np.uint8)
inpaintMask = cv2.cvtColor(inpaintMask, cv2.COLOR_BGR2GRAY)
# 显示原始图参考
cv2.imshow(WINDOW_NAME0, srcImage0);
# 显示原始图
cv2.imshow(WINDOW_NAME1, srcImage1);
# 设置鼠标回调函数
cv2.setMouseCallback("WINDOW_NAME1", onMouse)
# 轮询按键,进行处理
while True:
c = cv2.waitKey(0)
# 若按键键值为ESC时,退出
if c == 27:
break
# 键值为2,恢复成原始图像
if c == 50:
inpaintMask = np.zeros((srcImage1.shape[0], srcImage1.shape[1], 3), np.uint8)
inpaintMask = cv2.cvtColor(inpaintMask, cv2.COLOR_BGR2GRAY)
srcImage1 = srcImage.copy()
cv2.imshow(WINDOW_NAME1, srcImage1)
# 键值为1或者空格,进行图像修补操作
if c == 49 or c == 32:
inpaintedImage = cv2.inpaint(srcImage1, inpaintMask, 3, cv2.INPAINT_TELEA)
cv2.imshow(WINDOW_NAME2, inpaintedImage)
using OpenCvSharp;
using System;
namespace demo
{
internal class Program
{
public static string WINDOW_NAME0 = "【原始图参考】"; //为窗口标题定义的宏
public static string WINDOW_NAME1 = "【原始图】"; //为窗口标题定义的宏
public static string WINDOW_NAME2 = "【修补后的效果图】"; //为窗口标题定义的宏
public static Mat srcImage = new Mat();
public static Mat srcImage0 = new Mat();
public static Mat srcImage1 = new Mat();
public static Mat inpaintMask = new Mat();
public static Point previousPoint = new Point(-1, -1);
public static void on_Mouse(MouseEventTypes @event, int x, int y, MouseEventFlags flags, IntPtr userData)
{
//处理鼠标左键相关消息
if (@event == MouseEventTypes.LButtonUp || ((int)flags & (int)MouseEventFlags.LButton) == 0)
previousPoint = new Point(-1, -1);
else if (@event == MouseEventTypes.LButtonDown)
previousPoint = new Point(x, y);
//鼠标左键按下并移动,绘制出白色线条
else if (@event == MouseEventTypes.MouseMove && ((int)flags & (int)MouseEventFlags.LButton) > 0)
{
Point pt = new Point(x, y);
if (previousPoint.X < 0)
previousPoint = pt;
Cv2.Line(inpaintMask, previousPoint, pt, new Scalar(255, 255, 255), 5, LineTypes.Link8, 0);
Cv2.Line(srcImage1, previousPoint, pt, new Scalar(255, 255, 255), 5, LineTypes.Link8, 0);
previousPoint = pt;
Cv2.ImShow(WINDOW_NAME1, srcImage1);
}
}
static void Main(string[] args)
{
// 载入原图
srcImage = Cv2.ImRead("../../../images/Astral2.jpg");
if (srcImage.Empty())
{
Console.WriteLine("Could not open or find the image!");
return;
}
srcImage.CopyTo(srcImage0);
srcImage.CopyTo(srcImage1);
inpaintMask = new Mat(srcImage1.Size(), MatType.CV_8U);
//显示原始图参考
Cv2.ImShow(WINDOW_NAME0, srcImage0);
//显示原始图
Cv2.ImShow(WINDOW_NAME1, srcImage1);
// 设置鼠标回调消息
Cv2.SetMouseCallback(WINDOW_NAME1, new MouseCallback(on_Mouse));
RNG rng = new RNG(12345);
while (true)
{
//获取键值
int c = Cv2.WaitKey(0);
//按键键值为2时,恢复源图
if ((char)c == '2')
{
inpaintMask = new Mat(inpaintMask.Size(), inpaintMask.Type());
srcImage.CopyTo(srcImage1);
Cv2.ImShow(WINDOW_NAME1, srcImage1);
}
//若检测到按键值为1或者空格,则进行处理
if ((char)c == '1' || (char)c == ' ')
{
Mat inpaintedImage = new Mat();
Cv2.Inpaint(srcImage1, inpaintMask, inpaintedImage, 3, InpaintMethod.Telea);
Cv2.ImShow(WINDOW_NAME2, inpaintedImage);
inpaintedImage.Dispose();
}
}
}
}
}
C++版本代码如下:
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/photo/photo.hpp"
#include <iostream>
using namespace cv;
using namespace std;
#define WINDOW_NAME0 "【原始图参考】" //为窗口标题定义的宏
#define WINDOW_NAME1 "【原始图】" //为窗口标题定义的宏
#define WINDOW_NAME2 "【修补后的效果图】" //为窗口标题定义的宏
Mat srcImage0, srcImage1, inpaintMask;
Point previousPoint(-1, -1);//原来的点坐标
static void ShowHelpText()
{
//输出一些帮助信息
printf("\n\n\n\t欢迎来到【图像修复】示例程序~\n");
printf("\n\t请在进行图像修复操作之前,在【原始图】窗口中进行适量的绘制"
"\n\n\t按键操作说明: \n\n"
"\t\t【鼠标左键】-在图像上绘制白色线条\n\n"
"\t\t键盘按键【ESC】- 退出程序\n\n"
"\t\t键盘按键【1】或【SPACE】-进行图像修复操作 \n\n");
}
static void On_Mouse(int event, int x, int y, int flags, void*)
{
//鼠标左键弹起消息
if (event == EVENT_LBUTTONUP || !(flags & EVENT_FLAG_LBUTTON))
previousPoint = Point(-1, -1);
//鼠标左键按下消息
else if (event == EVENT_LBUTTONDOWN)
previousPoint = Point(x, y);
//鼠标按下并移动,进行绘制
else if (event == EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON))
{
Point pt(x, y);
if (previousPoint.x < 0)
previousPoint = pt;
//绘制白色线条
line(inpaintMask, previousPoint, pt, Scalar::all(255), 5, 8, 0);
line(srcImage1, previousPoint, pt, Scalar::all(255), 5, 8, 0);
previousPoint = pt;
imshow(WINDOW_NAME1, srcImage1);
}
}
int main(int argc, char** argv)
{
//改变console字体颜色
system("color 2F");
//显示帮助文字
ShowHelpText();
//载入原始图并进行掩膜的初始化
Mat srcImage = imread("../images/Astral2.jpg", -1);
if (!srcImage.data)
{
printf("读取图片错误,请确定目录下是否有imread函数指定图片存在~! \n");
return false;
}
srcImage0 = srcImage.clone();
srcImage1 = srcImage.clone();
inpaintMask = Mat::zeros(srcImage1.size(), CV_8U);
//显示原始图参考
imshow(WINDOW_NAME0, srcImage0);
//显示原始图
imshow(WINDOW_NAME1, srcImage1);
//设置鼠标回调消息
setMouseCallback(WINDOW_NAME1, On_Mouse, 0);
//轮询按键,根据不同的按键进行处理
while (1)
{
//获取按键键值
char c = (char)waitKey();
//键值为ESC,程序退出
if (c == 27)
break;
//键值为2,恢复成原始图像
if (c == '2')
{
inpaintMask = Scalar::all(0);
srcImage.copyTo(srcImage1);
imshow(WINDOW_NAME1, srcImage1);
}
//键值为1或者空格,进行图像修补操作
if (c == '1' || c == ' ')
{
Mat inpaintedImage;
inpaint(srcImage1, inpaintMask, inpaintedImage, 3, INPAINT_TELEA);
imshow(WINDOW_NAME2, inpaintedImage);
}
}
return 0;
}
Python版本代码如下:
import cv2
import numpy as np
WINDOW_NAME0="WINDOW_NAME0"
WINDOW_NAME1="WINDOW_NAME1"
WINDOW_NAME2="WINDOW_NAME2"
previousPoint = (-1,-1)
def onMouse(event, x, y, flags, param):
global srcImage1,inpaintMask,previousPoint
# 处理鼠标左键相关消息
if event == cv2.EVENT_LBUTTONUP or flags & cv2.EVENT_FLAG_LBUTTON <= 0:
previousPoint = (-1, -1)
elif event == cv2.EVENT_LBUTTONDOWN:
previousPoint = (x, y)
# 鼠标左键按下并移动,绘制出白色线条
elif event == cv2.EVENT_MOUSEMOVE or flags & cv2.EVENT_FLAG_LBUTTON > 0:
pt = (x,y)
if previousPoint[0] < 0:
previousPoint = pt
cv2.line(inpaintMask, previousPoint, pt, (255, 255, 255), 5, 8, 0)
cv2.line(srcImage1, previousPoint, pt, (255, 255, 255), 5, 8, 0)
previousPoint = pt
cv2.imshow(WINDOW_NAME1, srcImage1)
# 载入原图
srcImage=cv2.imread('../images/Astral2.jpg')
srcImage0=srcImage.copy()
srcImage1=srcImage.copy()
inpaintMask = np.zeros((srcImage1.shape[0], srcImage1.shape[1], 3), np.uint8)
inpaintMask = cv2.cvtColor(inpaintMask, cv2.COLOR_BGR2GRAY)
# 显示原始图参考
cv2.imshow(WINDOW_NAME0, srcImage0);
# 显示原始图
cv2.imshow(WINDOW_NAME1, srcImage1);
# 设置鼠标回调函数
cv2.setMouseCallback("WINDOW_NAME1", onMouse)
# 轮询按键,进行处理
while True:
c = cv2.waitKey(0)
# 若按键键值为ESC时,退出
if c == 27:
break
# 键值为2,恢复成原始图像
if c == 50:
inpaintMask = np.zeros((srcImage1.shape[0], srcImage1.shape[1], 3), np.uint8)
inpaintMask = cv2.cvtColor(inpaintMask, cv2.COLOR_BGR2GRAY)
srcImage1 = srcImage.copy()
cv2.imshow(WINDOW_NAME1, srcImage1)
# 键值为1或者空格,进行图像修补操作
if c == 49 or c == 32:
inpaintedImage = cv2.inpaint(srcImage1, inpaintMask, 3, cv2.INPAINT_TELEA)
cv2.imshow(WINDOW_NAME2, inpaintedImage)