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");
}
// 描述:包含程序所使用的头文件和命名空间
//-----------------------------------------------------------------------------------------------
#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");
}
相关文章推荐
- python3-opencv库(3)--图片颜色空间转换,利用HSV进行物体跟踪,图像通道分离与合并
- OpenCV入门三:OpenCV创建新图像以及遍历图片像素值和设置像素值
- opencv学习笔记(2)----颜色缩减(使用指针遍历图像)
- Opencv利用ROI将一张图片叠加到另一幅图像的指定位置
- OPenCV2 如何使用指针的方式遍历图像
- 学习《OpenCV 2 计算机视觉编程手册》第二章---使用指针遍历图像案例
- OpenCV读取多幅图片,读取系列图片,读取文件夹中指定图像类型的系列图片
- OpenCV学习篇之五 使用指针遍历图像
- OpenCV 图像遍历与颜色缩减
- opencv学习(十)颜色缩减 // 查表 // 计时 // 访问像素的三个方法(指针/STL迭代器(待详细了解)/动态地址)//历遍图像的14种方法
- OpenCV-009:识别摄像头图像中的指定颜色并显示
- OPENCV学习笔记2-2_图像遍历(使用指针)
- opencv学习(三)之图像像素遍历(颜色空间缩减、查找表)
- [OpenCV2]使用指针遍历图像
- OpenCV图像剪切,超出图像区域指定颜色填充
- 深度学习中图像的指定图像位置的裁剪处理-使用python、opencv
- opencv学习笔记(02)——遍历图像(指针法)
- OpenCV提取显示一张图片(或者视频)的R,G,B颜色分量
- android图像绘制(五)画布保存为指定格式/大小的图片