图像处理基础(七)
来源:互联网 发布:淘宝电商培训有用吗 编辑:程序博客网 时间:2024/05/21 06:19
1.图像空间分辨率与灰度分辨率
空间分辨率是看原图像转化为数字图像的像素点数,越多图像质量越高;灰度分辨率,即每一个像素点的灰度级数,灰度级越大,图像越清晰(个人理解)。
颜色深度(Color Depth)用来度量图像中有多少颜色信息可用于显示或打印像素,其单位是“位(Bit)”,所以颜色深度有时也称为位深度。常用的颜色深度是1位、8位、24位和32位。
黑白图像的灰度分辨率(颜色深度)(B&W、单色图像):
灰度图像的灰度分辨率(颜色深度):
灰度图像,是只要黑白,和其之间的灰色。
8位,256级灰度(0··255 或 -128··127);
某些图片可能会使用负数来表示,那么最高为就是正负号(0为正,1为负),那么范围就会是-128~127
16位,65536级灰度。
彩色图像的灰度分辨率(颜色深度):
每个像素通常是由红(R)、绿(G)、蓝(B)三个分量来表示的,分量介于(0,255)
http://www2.newsjz.com/dmtjx/dmt2/dmt24/200602/363.html
知识点链接:
cvmGet,cvmSet不能获取灰度图像的 http://hi.baidu.com/ccst_kmyu/item/475d2231ad13508cc2cf29cd
下表列出了常见的色彩深度、颜色数量和色彩模式的关系。色彩深度 颜色数量 色彩模式1位 2(黑白) 位图8位 256 索引颜色 16位 65536 灰度,16位/通道24位 16.7百万 RGB32位 CMYK,RGB48位 RGB,16位/通道32位的图像也可以是黑白的,那么只有两种颜色了
2.信噪比(SNR)(对这块的理解不是很透彻!)
实际图像中都包含信号和噪声
信噪比:信号强度同噪声强度之比
信噪比越大,图像质量越高。
3.像素邻域及连通性(4邻域,8邻域,对角邻域)
4连通:
8邻接:
m邻接:
4.三角函数对称中心指函数 是中心对称图形
中心对称图形:如果把一个图形绕某一点旋转180度后能与自身重合,这个图形就是中心对称图形。
5.图像位深
http://blog.csdn.net/ningyaliuhebei/article/details/19969343
6. 交叉存取颜色通道,对三通道RGB图像,像素存储顺序为BGR BGR BGR ... BGR;1 - 分开的颜色通道,对三通道RGB图像,像素存储顺序为RRR...R GGG...G BBB...B。cvCreateImage只能创建交叉存取图像 。见typedef struct _IplImage的定义。
7.关于图像的顶左结构与底左结构
顶左结构Left_Bottom:即图像的坐标原点在图像的左上角,对数据的操作也是按行从左上开始向下操作的。那底左结构Left_Top当然与顶左相反啦。即图像的坐标原点在图像的左下角,对数据的操作也是按行从左下开始向上操作的。
这两种不同的结构,在数据操作时尤其要注意,最近使用Opencv目标检测为这个搞得很头皮很疼。
图像操作中,关于顶左结构与底左结构的要点如下:
1.一般数据操作习惯按顶左结构。所以,对于底左结构的图像,首先要进行整个图像数据反转cvFlip。比如模板匹配、特征提取时,这点尤其重要。需要说明的是,虽然图像反转cvFlip(frame,frame,1),但是并不改变图像的坐标结构,即使反转仍然是原坐标结构。反转与图像的坐标结构是不同的概念。可以是顶左结构的图像frame向底左结构frame_copy的反转cvFlip(frame,frame_copy,1),只是数据进行反转,并不改变各自(frame、frame_copy)的坐标结构。
2.值得一提的是,cvCreateImage创建的图像默认是顶左结构;默认BMP图像为底左结构。
3.对顶左结构和底左结构的图像,坐标的计算不同。所以,在目标检测时,检测出目标后对目标区域的坐标提取需要注意不同的坐标体系。
参考地址:http://hi.baidu.com/gaoguide/item/1505109530ba1b34326eeb20
8.图像的反转cvFlip()
IplImage *pSrcImg = NULL;IplImage *pClnImg = NULL;pSrcImg = cvLoadImage(argv[1],1);if (pSrcImg == NULL){cout<<"failed to load image!"<<endl;return -1;}pClnImg = cvCloneImage(pSrcImg);cvFlip(pClnImg,NULL,0);cvNamedWindow("src",0);cvNamedWindow("turnover",0);cvShowImage("src",pSrcImg);cvShowImage("turnover",pClnImg);cvWaitKey(0);cvReleaseImage(&pSrcImg); cvReleaseImage(&pClnImg); cvDestroyWindow("src"); cvDestroyWindow("turnover");9,关于Iplimage的widthstep应该算是步长
http://jinxingn.blog.163.com/blog/static/4637450520122284439164/
http://blog.csdn.net/xidianzhimeng/article/details/16845097 好好看看
image->widthStep = (((image->width * image->nChannels *
(image->depth & ~IPL_DEPTH_SIGN) + 7)/8)+ align - 1) & (~(align - 1));
C语言位运算
~取反,0取反是1,1取反是0
<<是左移,比如1<<n,表示1往左移n位,即数值大小2的n次方
>>右移,类似左移,数值大小除以2的n次方&按位与,1与任意数等于任意数本身,0与任意数等于0,即1&x=x,0&x=0|按位或,x|y中只要有一个1则结果为1^按位异或,x^y相等则为0,不等则为1所有数值必须转换为二进制数才能位运算,每一位数相对应运算
10.IplImage, CvMat, Mat 的关系http://263796001-qq-com.iteye.com/blog/1409639 好好看看???
http://blog.csdn.net/quarryman/article/details/6566444 真心感觉这个还行.
opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化。而CvMat和IplImage类型更侧重于“图像”,opencv对其中的图像操作(缩放、单通道提取、图像阈值操作等)进行了优化。在opencv2.0之前,opencv是完全用C实现的,但是,IplImage类型与CvMat类型的关系类似于面向对象中的继承关系。实际上,CvMat之上还有一个更抽象的基类----CvArr,这在源代码中会常见。
CvMat第一,在OpenCV中没有向量(vector)结构。任何时候需要向量,都只需要一个列矩阵(如果需要一个转置或者共轭向量,则需要一个行矩阵)。第二,OpenCV矩阵的概念与我们在线性代数课上学习的概念相比,更抽象,尤其是矩阵的元素,并非只能取简单的数值类型,可以是多通道的值。
http://wenku.baidu.com/link?url=OLlEoQr48JcGJ18Z1DLCtJpAl3J_ksSNWA0zxFj-9STtH-EAuKf5Sg_F8lxur5c8jjhWNMYoU-j8GgAG67grUL3wi8kQ4OOoZSvezTH969m Cvmat讲解,好好看看。
http://blog.csdn.net/quarryman/article/details/6566444 OpenCV中CvMat的初始化,很不错,值得一看。
double a[6] = {1,2,3,4,5,6};double *Mp;CvMat *M = cvCreateMat(2,3,CV_32FC1); //cvCreateMat会创建CvMat,并为CvMat分配数据。cvInitMatHeader(M,2,3,CV_32FC1,a); //配合CvCreateMat来初始化CvMat对象。Mp = M->data.db;for (int i = 0; i < 2; i++){for (int j = 0; j < 3; j++){printf("%3.1f", Mp[i * 2 + j]);}printf("\n");}printf("\n");cvReleaseData(M);cvReleaseMat(&M);
注:CvMat的类型一定要一致double a[6] ,M->data.db,如果不一致会出现数据读取错误的情况。
CvCreateMat创建的CvMat,对象在堆上,数据也在堆上,所以cvInitMatHeader在指定新的数据所在的位置的同时,也将CvMat::hdr_refcount和CvMat::refcount都置为0,以便cvReleaseMat释放CvMat对象和数据。
也可将CvMat *M = cvCreateMat(2,3,CV_64FC1); 换成CvMat *M = cvCreateMatHeader(2,3,CV_64FC1);结果相同。
cvCreateMatHeader只会创建CvMat,不会为CvMat分配数据。cvCreateMatHeader可以配合cvInitMatHeader来初始化CvMat对象。因为cvCreateMatHeader创建的CvMat,对象在堆上,所以cvInitMatHeader在指定新的数据所在的位置的同时,也将CvMat::hdr_refcount置为0,以便cvReleaseMat释放CvMat对象和数据。
第三种情况:cvMat创建和初始化
double a[6] = {1,2,3,4,5,6};double b[6] = {11,22,33,44,55,66};double c[4] = {21,32,43,54};CvMat MM = cvMat(2,3,CV_32FC1,a); //第一次使用cvMatdouble *MMpdata = MM.data.db;for (int i = 0; i < 2; i++){for (int j = 0; j < 3; j++){printf("%f\n", MMpdata[i * 3 + j]);}printf("\n");}printf("\n");//再次使用cvMatMM = cvMat(2,3,CV_32FC1,b);MMpdata = MM.data.db;for (int i = 0; i < 2; i++){for (int j = 0; j < 3; j++){printf("%f\n", MMpdata[i * 3 + j]);}printf("\n");}printf("\n");//使用cvInitMatHeadercvInitMatHeader(&MM,2,4,CV_32FC1,c,CV_AUTO_STEP);//其余4个元素为随机赋值MMpdata = MM.data.db;for (int i = 0; i < 2; i++){for (int j = 0; j < 4; j++){printf("%f\n", MMpdata[i * 4 + j]);}printf("\n");}printf("\n");//cvReleaseData可以使CvMat::data.ptr置为NULL //不能调用cvReleaseMat,因cvMat未给CvMat分配数据 cvReleaseData(&MM);cvArr
Scalar
Mat是opencv2.0推出的处理图像的新的数据结构,现在越来越有趋势取代之前的cvMat和lplImage,相比之下Mat最大的好处就是能够更加方便的进行内存管理,不再需要程序员手动管理内存的释放。opencv2.3中提到Mat是一个多维的密集数据数组,可以用来处理向量和矩阵、图像、直方图等等常见的多维数据。
Mat类型对应的头文件是"highgui.h",在编译的时候仅仅加上#include "highgui.h" 这句话是不行的,得告诉系统你的作用域是什么,两种办法:1、在程序的最开始加上: using namespace cv;2、把Mat改为 cv::Mat
struct CvMat
A multi-channel dense matrix.
- int type
CvMat signature (CV_MAT_MAGIC_VAL) plus type of the elements. Type of the matrix elements can be retrieved using CV_MAT_TYPE macro:
For description of possible matrix elements, seeMat.
- int step
Full row length in bytes
- int* refcount
Underlying data reference counter
- union data
Pointers to the actual matrix data:
- ptr - pointer to 8-bit unsigned elements
- s - pointer to 16-bit signed elements
- i - pointer to 32-bit signed elements
- fl - pointer to 32-bit floating-point elements
- db - pointer to 64-bit floating-point elements
- int rows
Number of rows
- int cols
Number of columns
Matrix elements are stored row by row. Element (i, j) (i - 0-based row index, j - 0-based column index) of a matrix can be retrieved or modified using CV_MAT_ELEM macro:
To access multiple-channel matrices, you can useCV_MAT_ELEM(matrix, type, i, j*nchannels + channel_idx).
CvMat is now obsolete; consider using Mat instead.
图像调色板?????????????????????索引图像,调色板的索引.16色图像、256色图像这些索引图像,图像数据存贮的实际上是
调色板的索引。那么使用OpenCV库打开bmp图像后,如何获取图像的调色板从而获取像素的真正的RGB颜色呢?
http://hi.baidu.com/lzndinkwuhiluvr/item/0ffc836d1b933d34ad3e8302 bmp位图文件详解
http://www.docin.com/p-259845379.html
OpenCV图像结构_IplImage
http://wenku.baidu.com/link?url=_FvK2hf5AUm2OpJ2HAnSM6ERJIipi3IQcWcxXi0T8TzNZmnfw8DKU5r1NZxlHiGqnl5lx62_H4Kh28sWcl98em5Z4TukDSioyF9Tnxv7vTG
opencv IplImage与Bitmap转换http://www.cnblogs.com/tiandsp/archive/2012/10/22/2734552.html bmp文件格式分析
图像存储格式:RGB HSV
【算法设计】矩阵乘法
http://blog.csdn.net/xiaowei_cqu/article/details/8181215 好文章。
- 图像处理基础(七)
- 图像处理算法基础(七)---形态学边界提取
- 图像处理(七):图像变换
- Python-OpenCV 处理图像(七):图像灰度化处理
- Python-OpenCV 处理图像(七):图像灰度化处理
- 图像处理(七)给图像添加噪声
- 图像处理基础(二)
- 【OpenCV图像处理】七、图像的DCT
- Python-OpenCV 处理图像(六)(七)(八):对象识别 图像灰度化处理 图像二值化处理
- OpenCV自带例子(七)图像平滑处理
- Matlab图像处理学习笔记(七):surf特征点
- 图像处理(七)导向滤波磨皮
- 图像处理(七)导向滤波磨皮
- MATLAB学习笔记七(关于图像处理)
- 图像处理(七)导向滤波磨皮
- Python3与OpenCV3.3 图像处理(七)--洪填充
- OpenCV基础02(GUI+图像处理)
- 图像处理(〇)直方图修改基础
- ThinkPHP 3.2 + PHPExcel 导入导出文件 第三方类库不能用问题解决
- 主键 外键 表空间
- Android的所有权限按照分类总结说明
- Java静态内部类
- 团队精神(Teamwork)
- 图像处理基础(七)
- MPI聚合通信之归约操作
- 在MFC程序中如何注册/注销/检测ActiveX控件(.OCX)
- 定制NSLog便于打印调试
- unity3D iTween的使用
- PHP Ajax Xml/Json形式
- Mongodb VS Hbase
- 征服C指针-NULL
- 要点Java20 java.util.Collections