前言
-
**遇到的问题 **
-
如果我要针对于一张图片多个ROI区域分别进行图像处理,如多边形,矩形,旋转矩形,旋转椭圆等等,opencv中都有这些图形,我们只需要针对于这些图形进行掩码抠图再进行图像处理就行了,在图像处理完成后拼接回来。
-
效果图如下:
-
示例代码如下:
#include "stdafx.h"
#include "iostream"
#include "opencv2/opencv.hpp"
#include "memory"
using namespace cv;
using namespace std;
int main()
{
Mat image = imread("C:/Users/HD/Desktop/test.png");
// 定义旋转椭圆
RotatedRect rotRect(Point2f(500, 200), Size2f(400, 200), 45);
// 定义多边形顶点
Point pts[] = { Point(100, 100), Point(200, 100), Point(250, 200), Point(150, 300) };
int npts = sizeof(pts) / sizeof(pts[0]);
// 创建掩码图像
Mat mask2 = Mat::zeros(image.size(), CV_8UC1);
fillConvexPoly(mask2, pts, npts, 255);
// 创建掩码图像
Mat mask = Mat::zeros(image.size(), CV_8UC1);
ellipse(mask, rotRect, 255, -1);
// 应用掩码进行抠图
Mat result;
image.copyTo(result, mask);
//展示掩码图像
imshow("掩码", mask);
//画出掩码区域的图像
imshow("区域图像", result);
// 对抠出的区域进行灰度处理
Mat grayedRegion;//抠出来的区域图像
result.copyTo(grayedRegion, mask);
cvtColor(grayedRegion, grayedRegion, COLOR_BGR2GRAY);
imshow("区域灰度处理", grayedRegion);
// 将处理后的灰度区域放回抠图结果
grayedRegion.copyTo(result, mask);
Mat result2;
// 恢复未抠图区域,即为椭圆外区域
image.copyTo(result2, ~mask);
imshow("ROI区域以外图像", result2);
cvtColor(result, result, COLOR_GRAY2BGR); //把灰度图区域转为三通道,不然合并报错
bitwise_or(result, result2, result); // 使用按位或操作来合并两个区域
imshow("Result", result);
waitKey(0);
return 0;
}
定义多边形顶点
//Point pts[] = { Point(100, 100), Point(200, 100), Point(250, 200), Point(150, 300) };
//int npts = sizeof(pts) / sizeof(pts[0]);
//
创建掩码图像
//Mat mask2 = Mat::zeros(image.size(), CV_8UC1);
//fillConvexPoly(mask2, pts, npts, 255);