您的位置:首页 > 运维架构

opencv249图片指定颜色抠图(指针遍历图像法)

2017-09-02 17:08 381 查看
//---------------------------------【头文件、命名空间包含部分】--------------------------

// 描述:包含程序所使用的头文件和命名空间

//-----------------------------------------------------------------------------------------------

#include <opencv2/opencv.hpp>

#include <iostream>  

using namespace std;  

using namespace cv;  

//-----------------------------------【全局函数声明部分】-----------------------------------

//          描述:全局函数声明

//-----------------------------------------------------------------------------------------------

void colorReduce(Mat& inputImage, Mat& outputImage, int div);  

void ShowHelpText();

//--------------------------------------【main( )函数】---------------------------------------

//          描述:控制台应用程序的入口函数,我们的程序从这里开始执行

//-----------------------------------------------------------------------------------------------

int main( )  

{  
//【1】创建原始图并显示
Mat srcImage = imread("1.jpg");
if (srcImage.data==NULL)
{
return 1;
}
cvtColor(srcImage,srcImage,COLOR_BGR2HSV);
imshow("原始图像",srcImage);  

//【2】按原始图的参数规格来创建创建效果图
Mat dstImage;
dstImage.create(srcImage.rows,srcImage.cols,srcImage.type());//效果图的大小、类型与原图片相同 

ShowHelpText();

//【3】记录起始时间
double time0 = static_cast<double>(getTickCount());  

//【4】调用颜色空间缩减函数
colorReduce(srcImage,dstImage,32);  

//【5】计算运行时间并输出
time0 = ((double)getTickCount() - time0)/getTickFrequency();
cout<<"\t此方法运行时间为: "<<time0<<"秒"<<endl;  //输出运行时间
//【6】显示效果图
imshow("效果图",dstImage);  
waitKey(0);  

}  

//---------------------------------【colorReduce( )函数】---------------------------------

//          描述:使用【指针访问:C操作符[ ]】方法版的颜色空间缩减函数

//----------------------------------------------------------------------------------------------

void colorReduce(Mat& inputImage, Mat& outputImage, int div)  

{  
//参数准备
outputImage = inputImage.clone();  //拷贝实参到临时变量
int rowNumber = outputImage.rows;  //行数
int colNumber = outputImage.cols*outputImage.channels();  //列数 x 通道数=每一行元素的个数

uchar uLowB=0;
uchar uHighB=50;
uchar uLowG=80;
uchar uHighG=220;
uchar uLowR=160;
uchar uHighR=255;
if (colNumber==3)
{

//双重循环,遍历所有的像素值
for(int i = 0;i < rowNumber;i++)  //行循环
{  
uchar* data = outputImage.ptr<uchar>(i);  //获取第i行的首地址
for(int j = 0;j < colNumber;j=j+3)   //列循环,3列为一个像素
{  
if(uLowB<data[j]&&data[j]<uHighB&&uLowG<data[j+1]&&data[j+1]<uHighG&&uLowR<data[j+2]&&data[j+2]<=uHighR)
{
data[j]=data[j];//当前像素的蓝色通道
data[j+1]=data[j+1];//当前像素的绿色通道
data[j+2]=data[j+2];//当前像素的红色通道
}
else
{
data[j]=0;
data[j+1]=0;
data[j+2]=0;
}

// ---------【开始处理每个像素】-------------     
//data[j] = data[j]/div*div + div/2;  
//data[j] = data[j];  
// ----------【处理结束】---------------------
}  //行处理结束
}
}

}  

//-----------------------------------【ShowHelpText( )函数】----------------------------------

//          描述:输出一些帮助信息

//----------------------------------------------------------------------------------------------

void ShowHelpText()

{
//输出欢迎信息和OpenCV版本
printf("\n\n\t\t\t非常感谢购买《OpenCV3编程入门》一书!\n");
printf("\n\n\t\t\t此为本书OpenCV2版的第21个配套示例程序\n");
printf("\n\n\t\t\t   当前使用的OpenCV版本为:" CV_VERSION );
printf("\n\n  ----------------------------------------------------------------------------\n");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: