MATLAB
命令:I=imread('bmp格式的图像');
a=rgb2gray(b);
imhist(a);
VB,imhist也行
要有C语言用for(i=0;i<256;i++)
{
m_count[i]=0;
}
for(i=0;i<m_Height;i++)
for(j=0;j<m_Width;j++)
{
lpSrc=(unsigned char)m_lpDIBBits+((m_Width8+31)/324)i+j;
m_count[lpSrc]++;
}
也行。。。。。。。
颜色直方图是在许多图像检索系统中被广泛采用的颜色特征。它所描述的是不同色彩在整幅图像中所占的比例,而并不关心每种色彩所处的空间位置,即无法描述图像中的对象或物体。颜色直方图特别适于描述那些难以进行自动分割的图像。
OpenCV对颜色直方图进行统计的代码如下所示,在图像检索,镜头分割等领域使用的还是比较多的。
#include <cvh>#include <highguih>
#include <iostream>
using namespace std;
int main( int argc, char argv )
{
IplImage src= cvLoadImage("F:\\test3jpg");
IplImage hsv = cvCreateImage( cvGetSize(src), 8, 3 );
IplImage h_plane = cvCreateImage( cvGetSize(src), 8, 1 );
IplImage s_plane = cvCreateImage( cvGetSize(src), 8, 1 );
IplImage v_plane = cvCreateImage( cvGetSize(src), 8, 1 );
IplImage planes[] = { h_plane, s_plane };
/ H 分量划分为16个等级,S分量划分为8个等级 /
int h_bins = 16, s_bins = 8;
int hist_size[] = {h_bins, s_bins};
/ H 分量的变化范围 /
float h_ranges[] = { 0, 180 };
/ S 分量的变化范围/
float s_ranges[] = { 0, 255 };
float ranges[] = { h_ranges, s_ranges };
/ 输入图像转换到HSV颜色空间 /
cvCvtColor( src, hsv, CV_BGR2HSV );
cvCvtPixToPlane( hsv, h_plane, s_plane, v_plane, 0 );
/ 创建直方图,二维, 每个维度上均分 /
CvHistogram hist = cvCreateHist( 2, hist_size, CV_HIST_ARRAY, ranges, 1 );
/ 根据H,S两个平面数据统计直方图 /
cvCalcHist( planes, hist, 0, 0 );
/ 获取直方图统计的最大值,用于动态显示直方图 /
float max_value;
cvGetMinMaxHistValue( hist, 0, &max_value, 0, 0 );
/ 设置直方图显示图像 /
int height = 240;
int width = (h_binss_bins6);
IplImage hist_img = cvCreateImage( cvSize(width,height), 8, 3 );
cvZero( hist_img );
/ 用来进行HSV到RGB颜色转换的临时单位图像 /
IplImage hsv_color = cvCreateImage(cvSize(1,1),8,3);
IplImage rgb_color = cvCreateImage(cvSize(1,1),8,3);
int bin_w = width / (h_bins s_bins);
for(int h = 0; h < h_bins; h++)
{
for(int s = 0; s < s_bins; s++)
{
int i = hs_bins + s;
/ 获得直方图中的统计次数,计算显示在图像中的高度 /
float bin_val = cvQueryHistValue_2D( hist, h, s );
int intensity = cvRound(bin_valheight/max_value);
/ 获得当前直方图代表的颜色,转换成RGB用于绘制 /
cvSet2D(hsv_color,0,0,cvScalar(h180f / h_bins,s255f/s_bins,255,0));
cvCvtColor(hsv_color,rgb_color,CV_HSV2BGR);
CvScalar color = cvGet2D(rgb_color,0,0);
cvRectangle( hist_img, cvPoint(ibin_w,height),
cvPoint((i+1)bin_w,height - intensity),
color, -1, 8, 0 );
}
}
cvNamedWindow( "Source", 1 );
cvShowImage( "Source", src );
cvNamedWindow( "H-S Histogram", 1 );
cvShowImage( "H-S Histogram", hist_img );
cvWaitKey(0);
}
直方图是摄影中最可靠的工具之一,它可以让拍摄者在每一次拍摄完成之后都能够检查拍下的照片的曝光情况,不同的相机配备的屏幕的质量各有不同,在相机屏幕上看照片的感觉和在电脑上看甚至是手机上来看的感觉都是很不一样的。屏幕可能会欺骗我们的感官,但直方图不会。
一张照片有两个层面,一个是技术表现,一个是艺术表达。所谓技术表现,无非就是构图、曝光、细节的精准这些体现拍摄者对内容的掌控,相对来说是比较客观的。而艺术表达则是绝对主观的,即包含了拍摄者的主观意图,也包含了观看者的主观理解。
对于直方图来说,它不过就是一个数字模型,是绝对客观的技术表现,这一点很重要。
什么是直方图?
图像直方图是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数。可以借助观察该直方图了解需要如何调整亮度分布。这种直方图中,横坐标的左侧为纯黑、较暗的区域,而右侧为较亮、纯白的区域。因此,一张较暗的图像直方图中的数据多集中于左侧和中间部分;而整体明亮、只有少量阴影的图像则相反。
一个标准的直方图可以分为五个区域,在直方图中从左至右表现为画面中最暗的部分到最亮的部分,分为是黑色色阶、阴影、曝光度、高光、白色色阶。
下图的像素大量集中在画面左侧的阴影区域,从直方图中我们就能够看出如果这张照片是正确曝光的话,应该就是以暗调为主的。
简单来说,直方图就是在你拍摄的这个画面之中的整体的亮度分布的情况,图中横坐标表示图像的亮度分布,最左边最暗,最右边最亮,而纵坐标则表示在这个亮度区域内的像素分布,波峰集中的区域就是这个亮度在图像中的集中。
说的再通俗一点,照片的直方图可以直白的表达这张照片的色调。
如果直方图中的波峰集中在左侧,则说明这张照片整体色调偏暗,属于暗调照片,像下面这张图:
如果波峰多集中在直方图的右侧,那么就说明这张照片的整体色调偏亮,属于高调照片,就像下面这张图:
如果波峰在直方图的中间区域,那就说明这张照片属于中间调照片,整体色调适中,既不会偏亮也不会偏暗:
现代数码相机内应该都会内置直方图,主要是为了帮助我们在拍摄的过程中就能够有一个参考,以确保我们所拍摄的照片不会丢失高光或者阴影中的任何细节。
就像上面所说的,在相机的屏幕上看照片和在电脑上看照片的感觉是完全不同的,而且在相机屏幕中看可能还会受到现场光等一些干扰元素的影响。可能在相机屏幕里看或者在手机屏幕里面看都感觉好的不得了,但是一放到电脑上看大图就感觉不怎么样了。因此相机中内置的直方图为我们提供了一种参考,帮助我们在拍摄照片的时候就能够分析这张照片有没有丢失细节。
直方图中的最左侧和最右侧是代表全黑和全白的,如果画面中并不是纯黑或纯白,那么如果像素集中在两边就有可能是出现了欠曝或者过曝而导致画面变成死黑或死白,失去了全部的细节。如果在拍摄过程中发现这种情况,就可以通过调整曝光来调整画面。
另外,通过阅读直方图可以帮助我们判断图像的色调。
像下面这张照片,虽然蓝色通道在暗调处居多,但是就整体色调来说,直方图内的像素几乎平均分布在各个亮度区域,因此对应的画面之中的色调就会相对丰富。
当画面之中的像素主要集中在画面的两端的时候,就说明这张照片的亮部和暗部都很多,而一张照片同时具有亮部和暗部就说明这张照片给人的感觉就是反差强烈。就是高对比的画面。
相反的,如果像素集中在中间区域的话,就是低反差画面,对比很小。
经常会有听到有人问什么样的直方图才是最完美的直方图?需要明确的是,并不存在完美的直方图,直方图只是一个数据统计,是一个参考,并不是说一张照片直方图一定要怎样才好看,而是你应该要了解自己正在拍摄的场景应该会对应什么样的直方图。比方说在黑夜或者环境色调偏暗的环境下拍摄的时候,直方图就应该是偏左,而在环境色调都很明亮的时候,直方图就应该偏右,如果相反就说明曝光可能出了问题。
我们心中的目标画面决定了我们需要什么样的直方图,了解直方图能够帮助我们有效的减少在后期处理中挣扎的时间,通过对画面以及直方图中所提供的数据的分析,更加准确的将画面调整为自己想要的色调,同时,一旦我们熟练掌握了直方图的语言,也能够帮助我们在拍摄的过程中调整自己的作品的曝光的一致性。
提取程序源代码:
function IMG_Out=Circle_Region_Extract(IMG_In,Radius,Center)
if ~(abs(Center(1)-Radius)<0 & abs(Center(2)-Radius)<0) [m,n,~]=size(IMG_In); [X,Y]=meshgrid(1:n,1:m);
R_temp=sqrt((X-Center(1))^2+(Y-Center(2))^2); R_temp1=R_temp<=Radius; if(numel(size(IMG_In))>2)
R_Out=R_temp1im2double(IMG_In(:,:,1)); G_Out=R_temp1im2double(IMG_In(:,:,2)); B_Out=R_temp1im2double(IMG_In(:,:,3)); IMG_Out(:,:,1)=R_Out; IMG_Out(:,:,2)=G_Out; IMG_Out(:,:,3)=B_Out; else
IMG_Out=R_temp1im2double(IMG_In); end else
disp('exceed Radius'); end
imshow(IMG_Out);
例子:
某一通道灰度图
I=imread('C:\Users\Administrator\Desktop\Ajpg'); I1=Circle_Region_Extract(I(:,:,1),300,[700,840]);
效果图如下:
以上就是关于什么软件能直接获得图片的灰度直方图HISTOGRAM全部的内容,包括:什么软件能直接获得图片的灰度直方图HISTOGRAM、opencv如何实现对图像分块提取颜色直方图、如何阅读照片的直方图什么才是最完美的直方图等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)