cvNorm cvNormalize()使用

一般简单的过程习惯自己实现,opencv接口比较乱而且没有特别规范的文档,不过有的函数自己实现的和调用opencv 函数效率还是有很大的差距,对数据存取模式优化要好好深入了解一下;

cvNorm()cvNormalize()基本实现所有的归一化操作,并不是只支持传统的欧式距离(L2_Norm),参数里面可以选择L1_norm 已经范围拉伸,求范数也是一样,以后要认真看函数接口参数选项,虽然opencv库组织不是太好,但是经过这么多年的完善大部分操作都会有支持的;


对于不同的norm_type, 根据我的试验(mask=null)的时候, a,b(a>b)起的作用结果如下:
norm_type=CV_C时, src 被重新"缩放"(rescale)到dst, 使得dst的值是线性映射到[0,1]区间.(a,b其实无作用)
norm_type=CV_L1,或者 CV_L2时, 得到L1,L2规范化的dst.(a,b其实无作用)
norm_type=CV_MINMAX时, src会被缩放(rescale)和移动(translation)到dst,使得dst的值是线性映射到[b,a]区间.

L1_norm: 每個元素乘上1/sqrt(1+4+5+6+7+10)
L2_norm: 每個元素乘上1/sqrt(1+16+25+36+49+100)
CV_MINMAX:使每個元素限制在[a=5,b=0]之間算法如下:dst(i)=(src(i)-min(src))*(5-0)/(max(src)-min(src))


一个不错的关于各种norm的解释:

搞统计的人总是喜欢搞什么“变量选择”,变量选择实际上的
限制条件是L0 Norm,但这玩艺不好整,于是就转而求L1 Norm(使用均方误差,就是Lasso

,当然在Lasso出来之前搞信号处理的就有过类似的工作),Bishop在书里对着RVM好一通
吹牛,其实RVM只是隐含着去近似了一个L0 Norm, 所以得到了比SVM更稀疏的解(Tipping
写了RVM后不久就指出来了,可Bishop就是只字不提,好像贝叶斯推理有多牛,其实很多问
题都被掩盖了起来,指望一种理论解释所有的现象总是很危险的)。最近Bin Yu给了关于La
sso一致性的几乎充要条件。
  SVM方面也搞了很多L1 Norm方面的东西(就是Hinge Loss在加个L1 Norm做正则化项)。
  关于L1 Norm的正则化能产生稀疏解听到过个很形象地解释,那个图(L1 Norm就是个菱
形,L2 Norm是个圆)大家都看过吧,似然度(目标函数里的误差项)是个圆,求解的时候
就是拿这个圆往那个菱形(L1 Norm)圆(L2 Norm)上扔,L1的话就很可能撞到角上,所
以就稀疏了(上面是2维的情况,推广的多维就更容易撞到角上)。但如果这些变量高度相
关呢?那似然度就不是个球了,可能是个椭球,还有可能是个非常非常扁的家伙,这次再
扔就可能和正则化项很大一片都接触到了,这时候就很危险了,就果拟合了,如果数据少
,那么这时就算是做交叉验证、留一也都无法避免过拟合。
  有人提出来正则化项要满足“sparsity、unbiasedness、continuity”,这样Lp没有一个
可以同时满足,所以有人又搞了个SCAD. 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言和OpenCV实现图像的直方图可以通过以下步骤完成: 1. 读取图像文件并创建IplImage对象 2. 将图像转换为HSV色彩空间 3. 使用cvCalcHist函数计算直方图 4. 使用cvNormalize函数对直方图进行归一化 5. 创建一个图像用于显示直方图 6. 画出直方图并显示 以下是一个示例代码,可以实现显示图像的HSV直方图: ```c #include <cv.h> #include <highgui.h> int main(int argc, char** argv) { IplImage* img = cvLoadImage(argv[1], CV_LOAD_IMAGE_COLOR); IplImage* hsv = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3); cvCvtColor(img, hsv, CV_BGR2HSV); int hbins = 30, sbins = 32; CvHistogram* hist; { int hist_size[] = { hbins, sbins }; 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(&hsv, hist, 0, 0); cvNormalizeHist(hist, 1.0); int scale = 10; IplImage* hist_img = cvCreateImage(cvSize(hbins*scale, sbins*scale), 8, 3); cvZero(hist_img); for (int h = 0; h < hbins; h++) { for (int s = 0; s < sbins; s++) { float bin_val = cvGetReal2D(hist->bins, h, s); int intensity = cvRound(bin_val * 255 / (hbins * sbins)); cvRectangle(hist_img, cvPoint(h*scale, s*scale), cvPoint((h + 1)*scale - 1, (s + 1)*scale - 1), CV_RGB(intensity, intensity, intensity), CV_FILLED); } } cvNamedWindow("Histogram", 1); cvShowImage("Histogram", hist_img); cvWaitKey(0); cvReleaseImage(&img); cvReleaseImage(&hsv); cvReleaseImage(&hist_img); cvReleaseHist(&hist); cvDestroyWindow("Histogram"); return 0; } ``` 这个示例代码使用cvLoadImage函数读取图像文件,然后创建一个IplImage对象。接着,将图像转换为HSV色彩空间。然后,使用cvCreateHist函数创建一个直方图对象。使用cvCalcHist函数计算直方图,使用cvNormalize函数对直方图进行归一化。 之后,创建一个新的IplImage对象,用于显示直方图。使用cvRectangle函数画出每个直方图条,并按照直方图值的大小来设置颜色强度。最后,使用cvNamedWindow和cvShowImage函数显示直方图图像,并使用cvWaitKey函数等待用户按下按键。 注意,在使用cvCalcHist函数计算直方图时,需要将图像转换为HSV色彩空间。这是因为HSV色彩空间更适合用于直方图计算,因为它可以更好地区分颜色和亮度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值