首页 » C语言 » 【基于C++和Python的Opencv3学习笔记之颜色空间缩减、ROI提取及

【基于C++和Python的Opencv3学习笔记之颜色空间缩减、ROI提取及

原文 http://blog.csdn.net/qq_26123853/article/details/79187009

2018-01-29 02:00:35阅读(580)

颜色空间缩减

如果图像矩阵存储的是单通道像素,那么像素有256种可能取值,但是如果是是三通道的图像,那么像素就有256×256×256种可能性,如此多的颜色会对我们处理产生较大的影响。实际上,仅用颜色中有代表性的很小部分就可以达到同样的效果了,这时候颜色空间缩减就显得尤为重要。颜色空间缩减的基本原理是:将现有颜色空间数除以某一特定值,以得到较少的颜色数,比如颜色值0~9取0, 10~19取1,以此类推。在Opencv中访问像素有三种方式,分别是基于指针访问(C操作符[])、基于迭代器iterator访问和动态地址计算。

代码实现(基于C++)
#include "stdafx.h"
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\core\core.hpp>
#include<opencv2\imgproc\imgproc.hpp>
using namespace std;
using namespace cv;
// 采用指针方式访问像素
void colorReduce_1(Mat &input, Mat &output, int div)
{
	output = input.clone();
	int rowNum = output.rows;
	int colNum = output.cols * output.channels();
	for (int i = 0; i < rowNum; i++)
	{
		// ptr()函数获取图像任意行的首地址
		uchar *data = output.ptr<uchar>(i);
		for (int j = 0; j < colNum; j++)
		{
			data[j] = data[j] / div * div / 2;
		}
	}
}
void colorReduce_2(Mat &input, Mat &output, int div)
{
	output = input.clone();
	// 迭代器首地址
	Mat_<Vec3b>::iterator it = output.begin<Vec3b>();
	// 迭代器的终止位置
	Mat_<Vec3b>::iterator itend = output.end<Vec3b>();
	for (; it != itend; ++it)
	{
		(*it)[0] = (*it)[0] / div *div + div / 2;
		(*it)[1] = (*it)[1] / div * div + div / 2;
		(*it)[2] = (*it)[2] / div * div + div / 2;
	}
}
void colorReduce_3(Mat &input, Mat &output, int div)
{
	output = input.clone();
	int rowNum = output.rows;
	int colNum = output.cols;
	for (int i = 0; i < rowNum; i++)
	{
		for (int j = 0; j < colNum; j++)
		{
			// 成员函数at()存储的图像元素,但是必须知道图像数据类型,调用形式如下:
			// image.at(i,j)[channel] = value;
			output.at<Vec3b>(i, j)[0] = output.at<Vec3b>(i, j)[0] / div * div + div / 2;
			output.at<Vec3b>(i, j)[1] = output.at<Vec3b>(i, j)[1] / div * div + div / 2;
			output.at<Vec3b>(i, j)[2] = output.at<Vec3b>(i, j)[2] / div * div + div / 2;
		}
	}
}
int _tmain(int argc, _TCHAR* argv[])
{
	namedWindow("原始图像");
	namedWindow("指针访问");
	namedWindow("迭代器访问");
	namedWindow("动态地址访问"); 
	// 图像初始化
	Mat img = imread("1.jpg");
	Mat dst1, dst2, dst3;
	dst1.create(img.size(), img.type());
	dst2.create(img.size(), img.type());
	dst3.create(img.size(), img.type());
	
	// 第一种方式访问
	colorReduce_1(img, dst1, 32);
	// 第二种方式访问
	colorReduce_2(img, dst2, 32); 
	// 第三种方式访问
	colorReduce_3(img, dst3, 32);
	// 显示原图
	imshow("原始图像", img);
	// 效果图1
	imshow("指针访问", dst1);
	// 效果图2
	imshow("迭代器访问", dst2);
	// 效果图3
	imshow("动态地址访问", dst3);
	waitKey(0);
	return 0;
}


最新发布

CentOS专题

关于本站

5ibc.net旗下博客站精品博文小部分原创、大部分从互联网收集整理。尊重作者版权、传播精品博文,让更多编程爱好者知晓!

小提示

按 Ctrl+D 键,
把本文加入收藏夹