文章目录

一、函数简介

​OpenCV—python 颜色空间(RGB,HSV,Lab)​

inRange()函数
OpenCV中的inRange()函数将在两个阈值内的像素值设置为白色(255),而不在阈值区间内的像素值设置为黑色(0),该功能类似于之间所讲的双阈值化操作。

函数签名:

void inRange(InputArray src, InputArray lowerb,
InputArray upperb, OutputArray dst);

检查数组元素是否在另外两个数组元素值之间。这里的数组通常也就是矩阵Mat或向量。dst:二值化之后的图像。


参数1:输入要处理的图像,可以为单通道或多通道。

参数2:包含下边界的数组或标量。


参数3:包含上边界数组或标量。


参数4:输出图像,与输入图像src 尺寸相同且为CV_8U 类型。


copyTo()
两个重载函数:

void copyTo( OutputArray m ) const;
void copyTo( OutputArray m, InputArray mask ) const;

使用方法:
image.copyTo(OutputArray )     将 image 图像数据拷贝到 OutputArray 图像中。
image.copyTo(OutputArray ,mask) 将 image 图像数据 (与mask 对应图像数据中 mask!=0的区域 ) 拷贝到 OutputArray 图像中。

二、示例:

头文件 quick_opencv.h:声明类与公共函数

#pragma once
#include <opencv2\opencv.hpp>
using namespace cv;

class QuickDemo {
public:
...
void inrange_Demo(Mat& image);
};

主函数调用该类的公共成员函数

#include <opencv2\opencv.hpp>
#include <quick_opencv.h>
#include <iostream>
using namespace cv;


int main(int argc, char** argv) {
Mat src = imread("D:\\Desktop\\pandas_small22.png");
if (src.empty()) {
printf("Could not load images...\n");
return -1;
}
namedWindow("input", WINDOW_NORMAL);
imshow("input", src);

QuickDemo qk;
qk.inrange_Demo(src);
waitKey(0);
destroyAllWindows();
return 0;
}

源文件 quick_demo.cpp:实现类与公共函数

void QuickDemo::inrange_Demo(Mat& image) {
Mat hsv, mask;
cvtColor(image, hsv, COLOR_BGR2HSV);
inRange(hsv, Scalar(35, 43, 46), Scalar(77, 255, 255), mask);
imshow("mask", mask);

Mat redback = Mat::zeros(image.size(), image.type());
redback = Scalar(40, 40, 200);
bitwise_not(mask, mask);
imshow("~mask", mask);

image.copyTo(redback, mask);
imshow("redback", redback);
}

效果(我给熊猫换红竹):

OpenCV + CPP 系列(九)颜色空间_scala

示例2

void QuickDemo::inrange_Demo(Mat& image) {
int height = image.rows;
int width = image.cols;
const char* colors[8] = { "raw_image","red_mask","orange_mask","yellow_mask","green_mask","cyan_mask","blue_mask","purple_mask" };
//Mat result = Mat::zeros(Size(height * 4 + 5*3, width * 2 + 5), CV_8UC3);
Mat result(height * 4 + 5 * 3, width * 2 + 5, CV_8UC3, Scalar(127, 127, 127));
Mat hsv, red_mask, red0_mask, red1_mask, green_mask, blue_mask;
Mat orange_mask, yellow_mask, cyan_mask, purple_mask;
cvtColor(image, hsv, COLOR_BGR2HSV);

//红
inRange(hsv, Scalar( 0, 43, 46), Scalar( 10, 255, 255), red0_mask);
inRange(hsv, Scalar(156, 43, 46), Scalar(180, 255, 255), red1_mask);
bitwise_or(red0_mask, red1_mask, red_mask);

//橙、黄
inRange(hsv, Scalar(11, 43, 46), Scalar(25, 255, 255), orange_mask);
inRange(hsv, Scalar(26, 43, 46), Scalar(34, 255, 255), yellow_mask);

//绿、青、蓝、紫
inRange(hsv, Scalar( 35, 43, 46), Scalar( 77, 255, 255), green_mask);
inRange(hsv, Scalar( 78, 43, 46), Scalar( 99, 255, 255), cyan_mask);
inRange(hsv, Scalar(100, 43, 46), Scalar(124, 255, 255), blue_mask);
inRange(hsv, Scalar(125, 43, 46), Scalar(155, 255, 255), purple_mask);

cvtColor(red_mask, red_mask, COLOR_GRAY2BGR);
cvtColor(orange_mask, orange_mask, COLOR_GRAY2BGR);
cvtColor(yellow_mask, yellow_mask, COLOR_GRAY2BGR);
cvtColor(green_mask, green_mask, COLOR_GRAY2BGR);
cvtColor(cyan_mask, cyan_mask, COLOR_GRAY2BGR);
cvtColor(blue_mask, blue_mask, COLOR_GRAY2BGR);
cvtColor(purple_mask, purple_mask, COLOR_GRAY2BGR);

image.copyTo( result(Rect(0, 0, width, height)));
red_mask.copyTo( result(Rect(width + 5, 0, width, height)));

orange_mask.copyTo(result(Rect(0, height + 5, width, height)));
yellow_mask.copyTo(result(Rect(width + 5, height + 5, width, height)));

green_mask.copyTo( result(Rect(0, 2 * height + 5*2, width, height)));
cyan_mask.copyTo( result(Rect(width + 5, 2 * height + 5*2, width, height)));

blue_mask.copyTo( result(Rect(0, 3 * height + 5*3, width, height)));
purple_mask.copyTo(result(Rect(width + 5, 3 * height + 5*3, width, height)));


int half_x = (int)width / 3;
int half_y = (int)height * 0.95;
for (int i = 0; i < 4; i++)
{
int y = i * height + 5 * i;
putText(result, colors[2*i], Point(half_x, y + half_y), cv::FONT_HERSHEY_COMPLEX, 1, Scalar(100, 255, 255), 1, 8);
putText(result, colors[2*i+1], Point(width + 5 + half_x, y + half_y), cv::FONT_HERSHEY_COMPLEX, 1, Scalar(100, 255, 255), 1, 8);
}
imwrite("result.png", result);
waitKey(0);
}

OpenCV + CPP 系列(九)颜色空间_scala_02