【数字图像处理】计算输入图像(jpg、bmp等)的LBP纹理图、纹理直方图及纹理图各像素的直方图并显示

生成LBP纹理图,纹理直方图及纹理图的像素直方图并显示(opencv)。

  
  
#include <iostream.h>
#include <math.h>
#include "cv.h"
#include "highgui.h"
#include <stdio.h>
#include <string.h>
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<lbp_bins;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<lbp_sub_bins;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

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值