opencv 2 computer vision application programming第四章翻译

有点晚了先开个头,明天翻译具体内容

第四章 用直方图统计像素
这一章包括:
计算图像的直方图
应用查表以修改图像外观
补偿图像直方图
幕后使用直方图以检测特定的图像内容
使用平均移动算法以找到物体
使用直方图比较以恢复相似图像

计算灰度图像的直方图,并用图显示出来:

 1 #include <cv.h>
 2 #include <highgui.h>
 3
 4 using namespace std;
 5 using namespace cv;
 6
 7 class Histogram1D{
 8 private:
 9     int histSize[1];
10     float hranges[2];
11     const float* ranges[1];
12     int channels[1];
13 public:
14     Histogram1D(){
15         histSize[0]=256;
16         hranges[0]=0.0;
17         hranges[1]=255.0;
18         ranges[0]=hranges;
19         channels[0]=0;
20     }
21
22     MatND getHistogram(const Mat& image){
23         MatND hist;
24         calcHist(&image, 1, channels, Mat(), hist, 1,
25                  histSize, ranges);
26         return hist;
27     }
28     Mat getHistogramImage(const Mat& image){
29         MatND hist=getHistogram(image);
30         double maxVal=0;
31         double minVal=0;
32         minMaxLoc(hist, &minVal, &maxVal, 0, 0);
33         Mat histImg(histSize[0], histSize[0], CV_8U, Scalar(255));
34         int hpt=static_cast<int>(0.9*histSize[0]);
35         for(int h=0; h<histSize[0]; h++){
36             float binVal=hist.at<float>(h);
37             int intensity=static_cast<int>(binVal*hpt/maxVal);
38             line(histImg, Point(h, histSize[0]), Point(h, histSize[0]-intensity),Scalar::all(0));
39         }
40         return histImg;
41     }
42 };
43
44
45
46 int main(){
47     Mat image=imread("C:/testdir/barcode.bmp");
48     Histogram1D h;
49     MatND histo=h.getHistogram(image);
50 /*    for(int i=0; i<256; i++){
51         cout << "Value " << i << "=" <<
52                 histo.at<float>(i) << endl;
53     }
54     */
55     namedWindow("Histogram");
56     imshow("Histogram", h.getHistogramImage(image));
57     waitKey(0);
58 }

 threshold是边缘检测函数,例如可以这样应用

 1 #include <cv.h>
 2 #include <highgui.h>
 3
 4 using namespace std;
 5 using namespace cv;
 6
 7 class Histogram1D{
 8 private:
 9     int histSize[1];
10     float hranges[2];
11     const float* ranges[1];
12     int channels[1];
13 public:
14     Histogram1D(){
15         histSize[0]=256;
16         hranges[0]=0.0;
17         hranges[1]=255.0;
18         ranges[0]=hranges;
19         channels[0]=0;
20     }
21
22     MatND getHistogram(const Mat& image){
23         MatND hist;
24         calcHist(&image, 1, channels, Mat(), hist, 1,
25                  histSize, ranges);
26         return hist;
27     }
28     Mat getHistogramImage(const Mat& image){
29         MatND hist=getHistogram(image);
30         double maxVal=0;
31         double minVal=0;
32         minMaxLoc(hist, &minVal, &maxVal, 0, 0);
33         Mat histImg(histSize[0], histSize[0], CV_8U, Scalar(255));
34         int hpt=static_cast<int>(0.9*histSize[0]);
35         for(int h=0; h<histSize[0]; h++){
36             float binVal=hist.at<float>(h);
37             int intensity=static_cast<int>(binVal*hpt/maxVal);
38             line(histImg, Point(h, histSize[0]), Point(h, histSize[0]-intensity),Scalar::all(0));
39         }
40         return histImg;
41     }
42 };
43
44
45
46 int main(){
47     Mat image=imread("C:/testdir/Koala.jpg");
48 //    Mat image=imread("C:/testdir/barcode.bmp");
49     Histogram1D h;
50     Mat thresholded;
51     threshold(image, thresholded, 60, 255, THRESH_BINARY);
52     MatND histo=h.getHistogram(image);
53 /*    for(int i=0; i<256; i++){
54         cout << "Value " << i << "=" <<
55                 histo.at<float>(i) << endl;
56     }
57     */
58     namedWindow("Histogram");
59     imshow("Image", thresholded);
60     imshow("Histogram", h.getHistogramImage(image));
61     waitKey(0);
62 }

使用equalizeHist函数的时候报错,google之后发现要求图片格式应该为CV_8UC1才可以用的,所以平凡图像需要先转化咯:

 1 #include <cv.h>
 2 #include <highgui.h>
 3
 4 using namespace std;
 5 using namespace cv;
 6
 7 Mat equalize(const Mat& image){
 8     Mat result(image);
 9     equalizeHist(image, result);
10     return result;
11 }
12
13 int main(){
14     char* name="C:/testdir/Koala.jpg";
15     IplImage *img = cvLoadImage( name, CV_LOAD_IMAGE_GRAYSCALE );
16     Mat src( img, 0 );
17     src = Mat_<float>( src );
18     Mat dst = Mat::zeros( src.rows, src.cols, src.type() );
19     src = Mat_<uchar>(src);
20     equalizeHist( src, dst );
21     imshow("dst", src);
22     waitKey(0);
23     return 0;
24 }

 

时间: 2024-09-28 18:33:29

opencv 2 computer vision application programming第四章翻译的相关文章

opencv 2 computer vision application programming第五章翻译

第五章 用生态学过滤方法改变图像 这一章我们讨论:用形态过滤器磨损和扩大图像用形态过滤器打开和关闭图像用形态过滤器做边缘检测和角点检测用水印分割图像用抓取切割算法提取前景中物体   到google上找到了书对应的代码下载了,然后条码的边缘检测有了点想法. 1 /*------------------------------------------------------------------------------------------*\ 2 This file contains mate

opencv 2 computer vision application programming第二章翻译

第二章 操作像素在本章,我们会讲述:处理像素值用指针扫描图像用迭代器扫描图像写高效的图像扫描循环用相邻的方法扫描图像展示简单的图像计算定义感兴趣的区域[概述]为了建立计算机图像应用,你必须能够接触图像内容,并且最终修改或者创建图像.这一章中会教你如何操作图像元素,比如像素.你会学 习到如何扫描一幅图像并处理每个像素点.你也会学习到如何高效地做,因为就算是适当的维度的图像也会包含成千上万的像素的. 基本上将,一个图像时一个数值对应的矩阵.这就是OpenCV2用cv::Mat处理图像的原因了.矩阵中

Graph Cut and Its Application in Computer Vision

Graph Cut and Its Application in Computer Vision   原文出处: http://lincccc.blogspot.tw/2011/04/graph-cut-and-its-application-in.html 现在好像需要代理才能访问了...     网络流算法最初用于解决流网络的优化问题,比如水管网络.通信传输和城市的车流等.Graph cut作为其中一类最常见的算法,用于求解流网络的最小割,即寻找一个总容量最小的边集合,去掉这个集合中的所有边

Women In Computer Vision——CVPR上一道特殊的靓丽风景线

我们都知道,CVPR(Conference on Computer Vision and Pattern Recognition) IEEE国际计算机视觉与模式识别会议是IEEE举办的图像识别领域的顶级会议,在其领域.乃至整个深度学习和AI领域都拥有巨大的影响力.但大家也许不知道的是,这个大会除了在技术方面的影响力和实力非常强悍之外,在一些细节上还显得非常有人文关怀. 从CVPR2015开始,这两年CVPR的工作交流会议(WorkShop)上都出现了一个新的固定板块:Women In Compu

Performance Application Programming Interface 4.1.3发布

PAPI的目的是提供一个一致的界面和研究方法,提供工具设计和应用工程师发现在大多数主要的微处理器的硬件性能计数器的使用. Performance Application Programming Interface 4.1.3此版本增加了AMD Family 15h(Interlagos)处理器的支持,NVIDIA CUDA技术组件(待发布版本CUDA 4.0),并支持POWER7/AIX.各类错误的修正. 下载地址:http://icl.cs.utk.edu/projects/papi/down

Analyzing The Papers Behind Facebook&amp;#39;s Computer Vision Approach

Analyzing The Papers Behind Facebook's Computer Vision Approach Introduction                 You know that company called Facebook? Yeah, the one that has 1.6 billion people hooked on their website. Take all of the happy birthday posts, embarrassing

(转) WTF is computer vision?

    WTF is computer vision? Posted Nov 13, 2016 by Devin Coldewey, Contributor   Next Story     Someone across the room throws you a ball and you catch it. Simple, right? Actually, this is one of the most complex processes we've ever attempted to com

第四章——SQLServer2008-2012资源及性能监控(2) .

原文:第四章--SQLServer2008-2012资源及性能监控(2) . 本文接着上文继续,讲述如何监控CPU的使用情况 前言: CPU是服务器中最重要的资源.在数据库服务器中,CPU的使用情况应该时刻监控以便SQLServer一直处于最佳状态. 本文将会使用可靠性和性能监视器来获取CPU相关的使用统计信息 可靠性和性能监视器是过去性能监视器工具的加强版.同时拥有性能监视器的全部功能. 性能计数器提供对各种系统活动的统计功能.可以找到有数百种性能计数器来针对Windows操作系统或者第三方应

第四章、存储器管理

第四章.存储器管理 物理地址和逻辑地址 物理地址:存储单元的编号,可以直接寻址. 逻辑地址:程序中的地址,是可以改变的,不可直接寻址. 重定位:将逻辑地址空间的逻辑地址变换成内存空间的物理地址的过程. 静态重定位和动态重定位 静态重定位:当用于程序被装入内存时,一次性地实现逻辑地址到物理地址的转换,以后不再转换(一般在装入内存时由软件完成),直到该程序完成退出内存为止. 动态重定位:当用户程序被装入内存时,并不将其逻辑地址转换,而是保留原来的逻辑地址.等程序真正要执行时才将其逻辑地址通过动态计算