方法二、鼠標(biāo)框選區(qū)域+閾值處理+Mask膨脹處理
[cpp] view plain copy print?
#include 《imgproc/imgproc.hpp》
#include 《highgui/highgui.hpp》
#include 《core/core.hpp》
#include 《photo/photo.hpp》
using namespace cv;
Point ptL, ptR; //鼠標(biāo)畫出矩形框的起點(diǎn)和終點(diǎn)
Mat imageSource, imageSourceCopy;
Mat ROI; //原圖需要修復(fù)區(qū)域的ROI
//鼠標(biāo)回調(diào)函數(shù)
void OnMouse(int event, int x, int y, int flag, void *ustg);
//鼠標(biāo)圈定區(qū)域閾值處理+Mask膨脹處理
int main()
{
imageSource = imread(“Test.jpg”);
if (!imageSource.data)
{
return -1;
}
imshow(“原圖”, imageSource);
setMouseCallback(“原圖”, OnMouse);
waitKey();
}
void OnMouse(int event, int x, int y, int flag, void *ustg)
{
if (event == CV_EVENT_LBUTTONDOWN)
{
ptL = Point(x, y);
ptR = Point(x, y);
}
if (flag == CV_EVENT_FLAG_LBUTTON)
{
ptR = Point(x, y);
imageSourceCopy = imageSource.clone();
rectangle(imageSourceCopy, ptL, ptR, Scalar(255, 0, 0));
imshow(“原圖”, imageSourceCopy);
}
if (event == CV_EVENT_LBUTTONUP)
{
if (ptL != ptR)
{
ROI = imageSource(Rect(ptL, ptR));
imshow(“ROI”, ROI);
waitKey();
}
}
//單擊鼠標(biāo)右鍵開始圖像修復(fù)
if (event == CV_EVENT_RBUTTONDOWN)
{
imageSourceCopy = ROI.clone();
Mat imageGray;
cvtColor(ROI, imageGray, CV_RGB2GRAY); //轉(zhuǎn)換為灰度圖
Mat imageMask = Mat(ROI.size(), CV_8UC1, Scalar::all(0));
//通過閾值處理生成Mask
threshold(imageGray, imageMask, 235, 255, CV_THRESH_BINARY);
Mat Kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
dilate(imageMask, imageMask, Kernel); //對(duì)Mask膨脹處理
inpaint(ROI, imageMask, ROI, 9, INPAINT_TELEA); //圖像修復(fù)
imshow(“Mask”, imageMask);
imshow(“修復(fù)后”, imageSource);
}
}
鼠標(biāo)圈定的ROI:
?
圖像復(fù)原結(jié)果:
?
選定區(qū)域之外的圖像不受修復(fù)影響,沒有額外的損傷。
方法三、鼠標(biāo)劃定整個(gè)區(qū)域作為修復(fù)對(duì)象
這個(gè)方法選定一個(gè)矩形區(qū)域,把整個(gè)矩形區(qū)域作為要修復(fù)的對(duì)象,該方法適用于圖像結(jié)構(gòu)比較簡(jiǎn)單,特別是純色圖像,并且選定區(qū)域面積占比不大的情況,效果較好。
[cpp] view plain copy print?
#include 《imgproc/imgproc.hpp》
#include 《highgui/highgui.hpp》
#include 《core/core.hpp》
#include 《photo/photo.hpp》
using namespace cv;
Point ptL, ptR; //鼠標(biāo)畫出矩形框的起點(diǎn)和終點(diǎn)
Mat imageSource, imageSourceCopy;
Mat ROI; //原圖需要修復(fù)區(qū)域的ROI
//鼠標(biāo)回調(diào)函數(shù)
void OnMouse(int event, int x, int y, int flag, void *ustg);
//鼠標(biāo)圈定區(qū)域
int main()
{
imageSource = imread(“Test.jpg”);
if (!imageSource.data)
{
return -1;
}
imshow(“原圖”, imageSource);
setMouseCallback(“原圖”, OnMouse);
waitKey();
}
void OnMouse(int event, int x, int y, int flag, void *ustg)
{
if (event == CV_EVENT_LBUTTONDOWN)
{
ptL = Point(x, y);
ptR = Point(x, y);
}
if (flag == CV_EVENT_FLAG_LBUTTON)
{
ptR = Point(x, y);
imageSourceCopy = imageSource.clone();
rectangle(imageSourceCopy, ptL, ptR, Scalar(255, 0, 0));
imshow(“原圖”, imageSourceCopy);
}
if (event == CV_EVENT_LBUTTONUP)
{
if (ptL != ptR)
{
ROI = imageSource(Rect(ptL, ptR));
imshow(“ROI”, ROI);
waitKey();
}
}
//單擊鼠標(biāo)右鍵開始圖像修復(fù)
if (event == CV_EVENT_RBUTTONDOWN)
{
imageSourceCopy = Mat(imageSource.size(), CV_8UC1, Scalar::all(0));
Mat imageMask = imageSourceCopy(Rect(ptL, ptR));
//生成一個(gè)跟ROI大小一樣的值全為1的區(qū)域
Mat imageMaskCopy = Mat(imageMask.size(), CV_8UC1, Scalar::all(1));
imageMaskCopy.copyTo(imageMask);
inpaint(imageSource, imageSourceCopy, imageSource, 9, INPAINT_TELEA); //圖像修復(fù)
imshow(“Mask”, imageSourceCopy);
imshow(“修復(fù)后”, imageSource);
}
}
原始圖像:
?
圖像復(fù)原結(jié)果:
?
評(píng)論
查看更多