图像处理基础(七)

来源:互联网 发布:淘宝电商培训有用吗 编辑:程序博客网 时间: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是一个多维的密集数据数组,可以用来处理向量和矩阵、图像、直方图等等常见的多维数据。

opencv 中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:

int type = CV_MAT_TYPE(matrix->type);

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:

uchar pixval = CV_MAT_ELEM(grayimg, uchar, i, j)CV_MAT_ELEM(cameraMatrix, float, 0, 2) = image.width*0.5f;

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       

o​p​e​n​c​v​ ​ ​I​p​l​I​m​a​g​e​与​B​i​t​m​a​p​转​换

http://www.cnblogs.com/tiandsp/archive/2012/10/22/2734552.html    bmp文件格式分析

图像存储格式:RGB HSV

由于OpenCV主要针对的是计算机视觉方面的处理,因此在函数库中,最重要的结构体是IplImage结构。IplImage结构来源于Intel的另外一个函数库Intel Image Processing Library (IPL),该函数库主要是针对图像处理

【算法设计】矩阵乘法 

http://blog.csdn.net/xiaowei_cqu/article/details/8181215 好文章。


0 0
原创粉丝点击