opencv识别红绿蓝颜色并增强颜色的亮度

文章展示了如何使用OpenCV进行RGB到HSV转换,颜色筛选,以及使用InRange、掩码和增强技术来处理图像。
摘要由CSDN通过智能技术生成

首先将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);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值