计算机系统应用教程网站

网站首页 > 技术文章 正文

opencv之在算法设计中使用策略模式,找彩色图像中特定颜色区域!

btikc 2024-09-04 03:21:06 技术文章 10 ℃ 0 评论

策略模式是将算法封装在类中,在面向对象的编程中的特殊结构类中,可以通过替换或者组合算法来实现复杂的逻辑。

本文中的算法四路是:任意给定一幅彩色图像,根据给定的目标颜色,目标颜色可以是红色(Red),绿色(Green),蓝色(Blue)三基色中的一种,也可以是三基色的混合颜色。

//设置需要检测的颜色

void setTargetColor(unsigned char red, unsigned char green, unsigned char blue){

target[2] = red;

target[1] = green;

target[0] = blue;

};

如果需要设置为红色,可以设置为setTargetColor(255,0,0);设置为蓝色setTargetColor(0,0,255),依次类推。

查找特定的目标颜色区域,其实就是计算目彩色图片像素点与目标颜色比较的差值,当差值(也就是颜色的距离值小于某个阈值T)小于一个阈值就标记这个像素点为白色,否则为黑色。经过遍历整幅图像像素点以后就标记处想要的特定颜色的区域。计算颜色距离的函数为:

//计算两个目标的颜色距离

int cal_distance(const cv::Vec3b&color)

{

return abs(color[0] - target[0]) + abs(color[1] - target[1]) + abs(color[2] - target[2]);

};

step1:声明算法类;

ColorDetector cdtector;//①声明cdtector,类型为colorDetector

step2:加载图像;

Mat image = imread("101.jpg");//②读入图像

resize(image, imagenew, Size(600, 400), 0, 0, INTER_LINEAR);//缩小图片尺寸

step3:初始化输入参数,包括目标颜色;

cdtector.setTargetColor(200,0, 0);//③设置输入参数

step4:算法执行;

imshow("蓝天白云图", cdtector.process(image));//④处理并显示结果

step5:显示结果;

cdtector.setTargetColor(200,0, 0);

cdtector.setTargetColor(0,0,200);

附上源码:

#include<iostream>

#include<opencv2/core/core.hpp>

#include<opencv2/highgui/highgui.hpp>

#include "opencv2/imgproc/imgproc.hpp"

#include "opencv2/highgui/highgui.hpp"

#include <stdio.h>

#include <string.h>

/*******************************************

*@description: 在算法设计中使用策略模式

*@parameter:

*@retval:

******************************************/

using namespace cv;

using namespace std;

//创建一个算法类

class ColorDetector{

public:

ColorDetector() : minDist(50)//构造空函数

{

target[0] = target[1] = target[2] = 0;//初始化目标变量

};

//设置彩色距离阈值(距离必须为正,否则距离取0)

void SetColorDistanceThreshold(int distance){

if (distance < 0)

distance = 0;

minDist = distance;

};

//获取彩色距离阈值

int GetColorDistanceThreshold(int distance){

return minDist;

};

//设置需要检测的颜色

void setTargetColor(unsigned char red, unsigned char green, unsigned char blue){

target[2] = red;

target[1] = green;

target[0] = blue;

};

//获取需要检测的颜色

Vec3b getTargetColor(){

return target;

};

/*********************************

* 计算两个目标的颜色距离

* @par:

* @retval:

*********************************/

int cal_distance(const cv::Vec3b&color)

{

return abs(color[0] - target[0]) + abs(color[1] - target[1]) + abs(color[2] - target[2]);

};

Mat process(cv::Mat &image);//构造函数

private:

int minDist;//颜色与目标色最小距离

Vec3b target;//目标颜色

Mat result;//结果图像

};

cv::Mat ColorDetector::process(cv::Mat &image){

result.create(image.cols,image.rows,CV_8U);

Mat_<cv::Vec3b>::const_iterator it = image.begin<cv::Vec3b>();//初始位置迭代器

Mat_<cv::Vec3b>::const_iterator itend = image.end<cv::Vec3b>();//终止位置迭代器

Mat_<uchar>::iterator itout = result.begin<uchar>();//终止位置迭代器

//遍历每一个像素

for (; it != itend; ++it, ++itout)

{

//计算每一个像素与目标颜色的距离

if (cal_distance(*it) < minDist)

*itout = 255;

else *itout = 0;

}

return result;

}

int main()

{

Mat imagenew;

ColorDetector cdtector;//①声明cdtector,类型为colorDetector

Mat image = imread("101.jpg");//②读入图像

resize(image, imagenew, Size(600, 400), 0, 0, INTER_LINEAR);//缩小图片尺寸

cdtector.setTargetColor(0,0,200);//③设置输入参数

imshow("原图", imagenew);//显示原图

imshow("处理图", cdtector.process(imagenew));//④处理并显示结果

waitKey(0);

return 0;

}

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表