首先将RGB转换成HSV图片,利用不同颜色在HSV颜色空间的范围进行筛选,然后利用Inrange函数,将在两个阈值内的像素值设置为白色,设置掩码,使用addWeighted函数对所选择的区域进行增强。接下来使用boundingRect绘制出最小矩形框等到center坐标,并进行泊松融合最后得到结果。
#include <opencv2/opencv.hpp>
#include<vector>
using namespace cv;
using namespace std;
int main() {
Mat src = imread("color.jpg"); // Read the source image file
imshow("1", src);
Mat hsv;
cvtColor(src, hsv, COLOR_BGR2HSV);
Scalar lower_red1 = Scalar(0, 43, 46);
Scalar upper_red1 = Scalar(10, 255, 255);
Scalar lower_red2 = Scalar(156, 43, 46);
Scalar upper_red2 = Scalar(180, 255, 255);
Mat mask1, mask2;
inRange(hsv, lower_red1, upper_red1, mask1);
inRange(hsv, lower_red2, upper_red2, mask2);
Mat maskred;
bitwise_or(mask1, mask2, maskred);
Mat red; // 修改提取蓝色区域的变量名
bitwise_and(src, src,red, maskred);
Mat enhanced_red; // 修改增强后的蓝色区域的变量名
addWeighted(src, 1, red, 1.3, 0, enhanced_red);
Mat blurred_red; // 修改增强后的蓝色区域的变量名
GaussianBlur(enhanced_red, blurred_red, Size(9, 9), 0); //高斯模糊
Scalar lower_blue = Scalar(100, 43, 46); // 修改HSV颜色空间中的蓝色范围
Scalar upper_blue = Scalar(124, 255, 255);
Mat maskblue; // 修改掩码图像的变量名
inRange(hsv, lower_blue, upper_blue, maskblue);
//使用合并后的掩码图像提取原图像中的蓝色区域
Mat blue; // 修改提取蓝色区域的变量名
bitwise_and(src, src, blue, maskblue);
Mat enhanced_blue; // 修改增强后的蓝色区域的变量名
addWeighted(src, 1, blue, 1.2, 0, enhanced_blue);
Scalar lower_yellow = Scalar(26, 43, 46); // 修改HSV颜色空间中的蓝色范围
Scalar upper_yellow = Scalar(34, 255, 255);
Mat maskyellow; // 修改掩码图像的变量名
inRange(hsv, lower_yellow, upper_yellow, maskyellow);
//使用合并后的掩码图像提取原图像中的蓝色区域
Mat yellow; // 修改提取蓝色区域的变量名
bitwise_and(src, src, yellow, maskyellow);
Mat enhanced_yellow; // 修改增强后的蓝色区域的变量名
addWeighted(src, 1, yellow,1.2, 0, enhanced_yellow);
//在增强后的蓝色区域上使用高斯模糊或者双边滤波来平滑边缘
Mat blurred_yellow; // 修改增强后的蓝色区域的变量名
GaussianBlur(enhanced_yellow, blurred_yellow, Size(29, 29), 0); //高斯模糊
//bilateralFilter(enhanced_yellow, blurred_yellow, 5, 50, 50); //双边滤波
//检查源图像和目标图像是否是同样的类型和通道数
if (blurred_yellow.type() != src.type()) {
blurred_yellow.convertTo(blurred_yellow, src.type()); //转换类型
}
//检查掩码图像是否是单通道的二值图像
if (maskyellow.channels() != 1) {
cvtColor(maskyellow, maskyellow, COLOR_BGR2GRAY); //转换为灰度图
}
if (maskyellow.type() != CV_8U) {
threshold(maskyellow, maskyellow, 0, 255, THRESH_BINARY); //转换为二值图
}
//使用seamlessClone函数来实现无缝融合
Mat result;
//检查中心点是否在目标图像的范围内
Rect rect = boundingRect(maskred); //获取蓝色区域在目标图像上的最小矩形框
Point center = Point(rect.x + rect.width / 2, rect.y + rect.height / 2); //设置源图像的中心点为矩形框的中心点
seamlessClone(enhanced_red, src, maskred, center, result, MIXED_CLONE); //使用MIXED_CLONE模式
Mat img = imread("color.jpg");
rectangle(img, rect, Scalar(255, 0, 255), 2);//粉红色
imshow("2", src);
imshow("4",result);
//imshow("5", blurred_yellow);
waitKey(0);
}