OpenCV 1.0 颜色直方图操作(建立,获取bin,给bin赋值)

首先说明一点,对于直方图的概念需要清除,要知道什么是bin 以及直方图反映的是什么信息。

1) 直方图反映的是统计的信息,它反映了图像中像素值在特定范围(ranges)内的像素个数(bin)。

来看一下 创建直方图的函数原型:

cvCreateHist( int dims,                                                                                    //直方图的维数

int* sizes, int type,                                                                 // size 是直方图有多少块     , type 一般是默认的CV_HIST_ARRY

float** ranges CV_DEFAULT(NULL),                                 //ranges 是直方图的范围 

int uniform CV_DEFAULT(1));

2)直方图的用法

首先是获得要建立直方图的图像,然后设置直方图参数,计算直方图


3)代码演示实例:(对3通道的图像建立H-S 二维直方图)

/* 函数功能:返回一个直方图*/

CvHistogram *MakeUpHist(IplImage * src)
{
    int h_bits = 8, s_bits = 9;     //将h通道0-180的范围分成8个bin, 将s通道的0-255范围分成9个bin

    IplImage *srcHSV = cvCreateImage(cvGetSize(src),8,3);cvZero(srcHSV);
    IplImage *srcH   = cvCreateImage(cvGetSize(src),8,1);cvZero(srcH);
    IplImage *srcS   = cvCreateImage(cvGetSize(src),8,1);cvZero(srcS);
    IplImage *srcV   = cvCreateImage(cvGetSize(src),8,1);cvZero(srcV);

    cvCvtColor(src,srcHSV,CV_BGR2HSV);
    cvSplit(srcHSV,srcH,srcS,srcV,0);

    IplImage *planes_src[] = {srcH,srcS};     //对H和S通道建立二维直方图

    CvHistogram *hist;
    {
        int  hist_size[] = {h_bits,s_bits};
        float h_ranges[] = {0,180};
        float s_ranges[] = {0,255};
        float  *ranges[] = {h_ranges,s_ranges};

        hist = cvCreateHist(2 , hist_size , CV_HIST_ARRAY , ranges , 1);
    }

    cvCalcHist(planes_src,hist,0,0);         // 计算直方图

    return hist;                             //返回直方图

}

这样就获得了一个直方图的数据。当然也可以将这个直方图显示出来。

/* 显示直方图的函数
IplImage * showHist(CvHistogram *hist)
{
	float max_value;
	cvGetMinMaxHistValue( hist, 0, &max_value, 0, 0 );

	int scale = 10;

	//创建直方图图像
	int height = 240;
	int width = (h_bins*s_bins*3);
	IplImage* hist_img = cvCreateImage( cvSize(width,height), 8, 3 );cvZero( hist_img );

	IplImage * hsv_color = cvCreateImage(cvSize(1,1),8,3);
	IplImage * rgb_color = cvCreateImage(cvSize(1,1),8,3);
	int bin_w = width / (h_bins * s_bins);

	for(int h = 0; h < h_bins; h++)
	{
		for(int s = 0; s < s_bins; s++)
		{
			int i = h*s_bins + s;            //    i=0 的时候为黑色,有的时候分析不需要

			float bin_val = cvQueryHistValue_2D( hist, h, s );

			int intensity = cvRound(bin_val*height/max_value);

			cvSet2D(hsv_color,0,0,cvScalar(h*180.f / h_bins,s*255.f/s_bins,250,0));

			cvCvtColor(hsv_color,rgb_color,CV_HSV2BGR);
			CvScalar color = cvGet2D(rgb_color,0,0);

			cvRectangle( hist_img, cvPoint(i*bin_w,height),
				cvPoint((i+1)*bin_w,height - intensity),
				color, -1, 8, 0 );
		}
	}

	cvReleaseImage(&hsv_color);
	cvReleaseImage(&rgb_color);

	return hist_img;
}

去掉直方图中的黑色成分,然后将直方图归一化


	float *ptr = cvGetHistValue_2D(hist, 0,0);
	*ptr = 0.f;                                         // 对直方图中的 0,0  位置的bin 赋值为 0

        cvNormalizeHist(hist,1.0);                          // 将去掉黑色的直方图归一化操作








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OpencvSharp是一个在C#中使用OpenCV库的开源项目,它提供了一系列用于图像处理和计算机视觉的函数和工具。在OpencvSharp中进行颜色筛选可以通过以下步骤实现: 首先,导入所需的命名空间: ```csharp using OpenCvSharp; ``` 然后,读取输入图像: ```csharp Mat inputImage = Cv2.Imread("input.jpg"); ``` 接下来,将输入图像转换为HSV颜色空间(色相、饱和度、亮度): ```csharp Mat hsvImage = new Mat(); Cv2.CvtColor(inputImage, hsvImage, ColorConversionCodes.BGR2HSV); ``` 然后,使用InRange函数根据颜色范围创建一个二值图像: ```csharp Scalar lowerBound = new Scalar(0, 50, 50); // 设置颜色下限 Scalar upperBound = new Scalar(10, 255, 255); // 设置颜色上限 Mat colorMask = new Mat(); Cv2.InRange(hsvImage, lowerBound, upperBound, colorMask); ``` 最后,应用颜色掩码到输入图像上以获得筛选后的结果: ```csharp Mat filteredImage = new Mat(); Cv2.BitwiseAnd(inputImage, inputImage, filteredImage, colorMask); ``` 上述代码中,我们将输入图像转换为HSV颜色空间,然后根据设定的颜色上下限使用InRange函数创建一个二值图像。最后,通过应用颜色掩码到输入图像上,我们可以得到进行颜色筛选后的结果。 这是一个简单的OpencvSharp颜色筛选的实现示例,你可以根据具体需求进行调整和优化。请记住,此示例仅涵盖了基本的颜色筛选操作,实际的应用可能需要更复杂的算法和技术来实现更精确的筛选效果。 ### 回答2: 在OpenCvSharp中,可以使用颜色筛选来提取图像中指定颜色的区域。 首先,需要将图像转换为HSV颜色空间,因为HSV颜色空间对颜色的描述更加直观。可以使用Cv2的cvtColor函数来实现这一转换。 然后,根据需要筛选的颜色范围,可以使用inRange函数来将图像中落在指定颜色范围内的像素设置为白色,而其他像素则设置为黑色。这样就得到了颜色筛选后的二值图像。 接下来,可以使用findContours函数来提取二值图像中的轮廓。或者,如果只关心颜色筛选结果的整体信息,也可以使用moments函数计算图像的矩来获取颜色筛选区域的中心点坐标、面积等属性。 最后,可以根据需要对筛选结果进行处理,比如在原始图像上绘制轮廓、标记出中心点等。 需要注意的是,颜色筛选的准确性受到多方面因素的影响,比如光照条件、摄像机设置等,因此在实际应用中可能需要根据具体情况进行调整和优化。另外,OpenCvSharp还提供了其他图像处理功能,比如滤波、形态学操作等,可以进一步对筛选结果进行加工和改进。 ### 回答3: OpenCvSharp是一个用于图像处理和计算机视觉的开源库。在OpenCvSharp中,我们可以使用不同的方法来进行颜色筛选。 一种常用的方法是使用inRange函数。该函数可以帮助我们选择在指定颜色范围内的像素。我们需要提供一个包含最低和最高HSV(色相、饱和度、值)值的掩码,函数将返回一个二进制图像,其中包含了属于指定颜色范围内的像素。这在分割图像中的特定颜色区域时非常有用。 另一种方法是使用cvtColor函数将图像转换为HSV颜色空间。HSV颜色空间是一种更直观的表示颜色的方式,其中色相表示颜色的主要属性,饱和度表示颜色的鲜艳程度,而值表示颜色的亮度。一旦我们将图像转换为HSV颜色空间,就可以使用inRange函数来筛选出符合我们要求的像素。 除了基本的颜色筛选方法之外,我们还可以使用其他技术来检测和识别特定颜色。例如,我们可以使用HSV颜色直方图来分析图像中的颜色分布,找到最频繁出现的颜色,从而进行筛选。我们也可以使用颜色特征和机器学习算法来训练一个模型来识别特定颜色。 总而言之,OpenCvSharp提供了多种方法来进行颜色筛选,包括inRange函数和颜色特征分析。这些方法可以帮助我们有效地处理图像中的颜色信息,从而实现各种应用,例如目标检测、图像分割和图像识别等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值