c语言绘制图像直方图 您所在的位置:网站首页 c语言画直方图 c语言绘制图像直方图

c语言绘制图像直方图

#c语言绘制图像直方图| 来源: 网络整理| 查看: 265

#include

#include

#include "cv.h"

#include "highgui.h"

#include

#include

char filename[100];

int main(int argc, char* argv[])

{

cvNamedWindow("src", 1);

cvNamedWindow("texture",1);

cvNamedWindow("LBP-His", 1);

cvNamedWindow("LBP-His-Sub", 1);

IplImage *pImage=cvLoadImage("lena.jpg",-1);//

IplImage* m_cvImage = cvCreateImage(cvGetSize(pImage), 8, 1);//灰度图像

IplImage* m_cvLBPImage = cvCreateImage(cvGetSize(pImage), 8, 1);//LBP值图像

cvShowImage("src", pImage);

CvMat *histogram2= NULL;

histogram2= cvCreateMat(pImage->height, pImage->width, CV_32FC1);

if (pImage->nChannels == 3)

{

cvCvtColor(pImage,m_cvImage , CV_BGR2GRAY);//色彩空间转换(灰色空间)

}

cvConvert(m_cvImage, histogram2);

for(int i1=0 ; i1< histogram2->rows; i1++)

{

histogram2->data.fl[i1] = 0.0;///一次一行

}

int center=0;

int center_lbp=0;

//计算每个点的LBP值,生成纹理图

for (int row=1; row < m_cvImage->height-1; row++)

for (int col=1; col < m_cvImage->width-1; col++)

{

center = (int)cvGetReal2D(m_cvImage, row, col);

center_lbp = 0;

if (center >= cvGetReal2D(m_cvImage, row-1, col-1))

{

center_lbp += 1;//从左上开始 顺时针

}

if (center >= cvGetReal2D(m_cvImage, row-1, col))

{

center_lbp += 2;

}

if (center >= cvGetReal2D(m_cvImage, row-1, col+1))

{

center_lbp += 4;

}

if (center >= cvGetReal2D(m_cvImage, row, col-1))

{

center_lbp += 8;

}

if (center >= cvGetReal2D(m_cvImage, row, col+1))

{

center_lbp += 16;

}

if (center >= cvGetReal2D(m_cvImage, row+1, col-1))

{

center_lbp += 32;

}

if (center >= cvGetReal2D(m_cvImage, row+1, col))

{

center_lbp += 64;

}

if (center >= cvGetReal2D(m_cvImage, row+1, col+1))

{

center_lbp += 128;

}

cvSetReal2D(m_cvLBPImage, row, col, center_lbp);

}

显示整幅图像的纹理图

cvShowImage("texture", m_cvLBPImage);

计算显示整幅图像的纹理直方图

int lbp_bins = 100;块数

float lbp_ranges[] = { 0, 255 };///上下界

float* pb_ranges = lbp_ranges;///格式转换

CvHistogram* hist_lbp = cvCreateHist( 1, &lbp_bins, CV_HIST_ARRAY, &pb_ranges, 1 );//生成直方图

// int dims, int* sizes, int type, float** ranges=NULL, int uniform=1 );

//uniform归一化标识,如果不为0,则ranges[i]是包含两个元素的范围数组,包括直方图第i维的上界和下界。

//在第i维上的整个区域 [lower,upper]被分割成 dims[i] (dims[i]表示直方图第i维的块数)个相等的块

cvCalcHist( &m_cvLBPImage, hist_lbp, 0, 0 );//生成直方图

cvNormalizeHist(hist_lbp,1.0);///直方图归一化

// 获取直方图统计的最大值,用于动态显示直方图

float max_value;

cvGetMinMaxHistValue(hist_lbp, 0, &max_value, 0, 0 );

// 设置直方图显示图像

int scale = 2;

int hist_height = 100;

int height =hist_height;//240;

int width = (lbp_bins*scale);///6

IplImage* hist_img = cvCreateImage( cvSize(width,height), 8, 1 );

cvZero( hist_img );

//用来获取bin的灰度值,作为显示的一个参数

IplImage * gray_color = cvCreateImage(cvSize(1,1),8,1);

//将直方图转换为图像显示

for(int i=0;i

{

float r_bin_val = cvQueryHistValue_1D(hist_lbp,i);///获取bin的值

int r_intensity = cvRound(r_bin_val*hist_height/max_value);四舍五入 返回正整数

// 获得当前直方图代表的颜色,填充到图像中

cvSet2D(gray_color,0,0,cvScalar(i*255.f / lbp_bins,0,0,0));

// 转换格式

CvScalar color = cvGet2D(gray_color,0,0);

//画矩形并填充颜色-灰度值

cvRectangle(

hist_img,

cvPoint(i*scale,hist_height-1),//再两个点之间自动选择右上右下

cvPoint((i+1)*scale - 1, hist_height-r_intensity),//

color//CV_RGB(100,100,100)

);

}

cvShowImage("LBP-His", hist_img);

//计算每个像素的纹理直方图 R=2 P=6 K=2

IplImage* gray_sub_img[2];子纹理图 320*240 宽*高

CvHistogram* hist_sub_lbp[320][240][2];///子纹理直方图

int lbp_sub_bins = 100;块数

float lbp_sub_ranges[] = { 0, 255 };///上下界

float* pb_sub_ranges = lbp_sub_ranges;///格式转换

///生成子纹理图直方图

for ( row=1; row < m_cvImage->height-1; row++)

for (int col=1; col < m_cvImage->width-1; col++)

{

gray_sub_img[0]= cvCreateImage( cvSize(3,3), 8, 1 );申请空间,创建子纹理图

gray_sub_img[1]= cvCreateImage( cvSize(3,3), 8, 1 );申请空间,创建子纹理图

hist_sub_lbp[row][col][0]= cvCreateHist( 1, &lbp_sub_bins, CV_HIST_ARRAY, &pb_sub_ranges, 1 );///申请空间,创建子直方图

hist_sub_lbp[row][col][1]= cvCreateHist( 1, &lbp_sub_bins, CV_HIST_ARRAY, &pb_sub_ranges, 1 );///申请空间,创建子直方图

cvZero( gray_sub_img[0]);cvZero( gray_sub_img[1]);

///第一个直方图

int pixel_data;//=(int)cvGetReal2D(m_cvLBPImage, row, col);

//cvSetReal2D(gray_sub_img[0],1,1,pixel_data);

pixel_data=(int)cvGetReal2D(m_cvImage, row-1, col-1);

cvSetReal2D(gray_sub_img[0],0,0,pixel_data);

pixel_data=(int)cvGetReal2D(m_cvImage, row-1, col);

cvSetReal2D(gray_sub_img[0],0,1,pixel_data);

pixel_data=(int)cvGetReal2D(m_cvImage, row-1, col+1);

cvSetReal2D(gray_sub_img[0],0,2,pixel_data);

pixel_data=(int)cvGetReal2D(m_cvImage, row, col-1);

cvSetReal2D(gray_sub_img[0],1,0,pixel_data);

pixel_data=(int)cvGetReal2D(m_cvImage, row, col+1);

cvSetReal2D(gray_sub_img[0],1,2,pixel_data);

pixel_data=(int)cvGetReal2D(m_cvImage, row+1, col);

cvSetReal2D(gray_sub_img[0],2,1,pixel_data);

pixel_data=(int)cvGetReal2D(m_cvImage, row+1, col+1);

cvSetReal2D(gray_sub_img[0],2,2,pixel_data);

//第二个直方图

pixel_data=(int)cvGetReal2D(m_cvLBPImage, row-1, col);

cvSetReal2D(gray_sub_img[1],0,1,pixel_data);

pixel_data=(int)cvGetReal2D(m_cvImage, row-1, col+1);

cvSetReal2D(gray_sub_img[1],0,2,pixel_data);

pixel_data=(int)cvGetReal2D(m_cvImage, row, col-1);

cvSetReal2D(gray_sub_img[1],1,0,pixel_data);

pixel_data=(int)cvGetReal2D(m_cvImage, row, col+1);

cvSetReal2D(gray_sub_img[1],1,2,pixel_data);

pixel_data=(int)cvGetReal2D(m_cvImage, row+1, col-1);

cvSetReal2D(gray_sub_img[1],2,0,pixel_data);

pixel_data=(int)cvGetReal2D(m_cvImage, row+1, col);

cvSetReal2D(gray_sub_img[1],2,1,pixel_data);

cvCalcHist( &gray_sub_img[0], hist_sub_lbp[row][col][0], 0, 0 );//生成直方图

cvCalcHist( &gray_sub_img[1], hist_sub_lbp[row][col][1], 0, 0 );//生成直方图

cvNormalizeHist(hist_sub_lbp[row][col][0],1.0);///直方图归一化

cvNormalizeHist(hist_sub_lbp[row][col][1],1.0);///直方图归一化

}

//显示子纹理图直方图

// 设置直方图显示图像参数

int sub_scale = 3;

hist_height = 100;

height =hist_height;//240;

width = (lbp_sub_bins*scale);///6

IplImage* hist_sub_img = cvCreateImage( cvSize(width,height), 8, 1 );

cvZero( hist_sub_img );

//用来获取bin的灰度值,作为显示的一个参数

IplImage * gray_sub_color = cvCreateImage(cvSize(1,1),8,1);

//将直方图转换为图像显示

// 获取直方图统计的最大值,用于动态显示直方图

float max_sub_value;

cvGetMinMaxHistValue(hist_sub_lbp[200][123][0], 0, &max_sub_value, 0, 0 );

for(i=0;i

{

float r_bin_val = cvQueryHistValue_1D(hist_sub_lbp[200][123][0],i);///获取bin的值

int r_intensity = cvRound(r_bin_val*hist_height/max_sub_value);四舍五入 返回正整数

// 获得当前直方图代表的颜色,填充到图像中

cvSet2D(gray_sub_color,0,0,cvScalar(i*255.f / lbp_sub_bins,0,0,0));

// 转换格式

CvScalar color = cvGet2D(gray_sub_color,0,0);

//画矩形并填充颜色-灰度值

cvRectangle(

hist_sub_img,

cvPoint(i*sub_scale,hist_height-1),//再两个点之间自动选择左上右下

cvPoint((i+1)*sub_scale - 1, hist_height-r_intensity),//

color//CV_RGB(100,100,100)

);

}

cvShowImage("LBP-His-Sub", hist_sub_img);

cvWaitKey(0);

释放申请的空间

cvReleaseImage(&gray_sub_img[0]);

cvReleaseImage(&gray_sub_img[1]);

for ( row=1; row < m_cvImage->height-1; row++)

for (int col=1; col < m_cvImage->width-1; col++)

{

cvReleaseHist(&hist_sub_lbp[row][col][0]);

cvReleaseHist(&hist_sub_lbp[row][col][1]);

}

释放申请的空间

cvReleaseImage(&m_cvLBPImage);

cvReleaseImage(&m_cvImage);

cvReleaseImage(&pImage);

cvReleaseHist(&hist_lbp);

return 0;

}

//感谢: http://www.cnblogs.com/slysky/archive/2011/10/13/2210745.html



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有