编程实现计算图像直方图、图像熵解析
图像直方图实验报告
图像直方图实验报告实验目的本实验旨在通过使用Python编程语言对图像直方图进行分析和可视化,加深对图像亮度分布的理解,并通过实验结果来探索不同图像的特点和相似性。
实验步骤1. 导入必要的库在开始实验之前,首先需要导入所需的Python库,包括numpy、matplotlib.pyplot和cv2。
可以使用以下代码导入这些库:import numpy as npimport matplotlib.pyplot as pltimport cv22. 读取图像数据选择一张感兴趣的图像作为实验对象,并使用cv2库中的imread()函数读取图像数据。
例如,可以使用以下代码读取名为image.jpg的图像:image = cv2.imread('image.jpg', 0)3. 计算图像直方图使用numpy库中的histogram()函数计算图像的直方图。
直方图是一个表示图像亮度级别频率分布的数组。
可以使用以下代码计算直方图:histogram = np.histogram(image.flatten(), bins=256, range=[0, 256])上述代码将返回一个包含图像直方图数据的数组。
4. 可视化直方图使用matplotlib.pyplot库中的bar()函数将图像直方图可视化。
可以使用以下代码绘制直方图:plt.figure()plt.title('Image Histogram')plt.xlabel('Bins')plt.ylabel('Frequency')plt.bar(histogram[1][:-1], histogram[0], width=1, color='gray')plt.show()上述代码将绘制一个表示图像亮度级别频率分布的直方图。
5. 结果分析通过观察直方图,可以分析图像的亮度特性和分布情况。
Python+OpenCV图像处理之直方图统计
Python+OpenCV图像处理之直⽅图统计⽬录1.直⽅图概述(1)基本概念(2)直⽅图中的术语2.直⽅图绘制(1)读取图像信息(2)绘制直⽅图3.掩膜直⽅图(1)基本概念(2)实现代码4.H-S直⽅图(1)基本概念(2)绘制⼆维H-S直⽅图1. 直⽅图概述(1)基本概念直⽅图就是对图像的另外⼀种解释,它描述了整幅图像的灰度分布。
直⽅图的 x 轴代表灰度值(0~255),y 轴代表图⽚中同⼀种灰度值的像素点的数⽬,所以通过直⽅图我们可以对图像的亮度、灰度分布、对⽐度等有了⼀个直观的认识(2)直⽅图中的术语BINS前⾯说到,直⽅图中的 x 轴表⽰的是灰度值,⼀幅灰度图的灰度等级有 256 级,所以我们是否需要将每⼀个等级标注在⼀条轴上呢?或者如果我们需要的不是每⼀个灰度值的分布,⽽是⼀个范围内的灰度分布呢?所以我们将每⼀个需要的灰度值范围称为⼀个 BIN,即所有的灰度等级被分为⼏个⼩组,每⼀个⼩组是⼀个 BINDIMS代表的是我们收集的图像的参数的数⽬,直⽅图我们如果只收集灰度值⼀个参数,那么该参数的值就是1RANGE代表统计的灰度值的范围,⼀般的范围是[0-255]2. 直⽅图绘制(1)读取图像信息在计算机视觉系列的⽂章中第⼀件事就是读取图像信息:"""Author:XiaoMadate:2021/10/24"""#调⽤需要的包import cv2import matplotlib.pyplot as pltimg0 = cv2.imread('E:\From Zhihu\For the desk\cvseven.jpeg')img1 = cv2.cvtColor(img0, cv2.COLOR_BGR2GRAY) #转化为灰度图h, w = img1.shape[:2]print(h, w)dWindow("W0")cv2.imshow("W0", img1)cv2.waitKey(delay = 0)图像信息如下:419 636(2)绘制直⽅图绘制直⽅图使⽤的函数如下:hist = cv2.calcHist(images, channels, mask, histSize, ranges, accumulate)images:原图channels:指定通道 [0]代表灰度图,如果读⼊的图像不是灰度图,该值可以是[0],[1],[2]分别代表通道 B,G,Rmask:掩码图像,进⾏整张图的绘制时为 NonehistSize:BIN 的数量ranges:像素值范围accumulate:累计标识,⼀般可以省略灰度图的直⽅图#绘制直⽅图hist = cv2.calcHist([img1], [0], None, [256], [0, 255])plt.plot(hist, color = 'lime', label = '直⽅图', linestyle = '--')plt.legend()plt.savefig('E:\From Zhihu\For the desk\cvseven1.jpeg')plt.show()可以看出这幅灰度图中亮度较⾼的像素点还是占多数的,即整体亮度较⾼彩⾊图直⽅图读⼊彩⾊图像,并对某⼀个通道进⾏直⽅图绘制"""Author:XiaoMadate:2021/10/24"""#调⽤需要的包import cv2import matplotlib.pyplot as pltplt.rcParams['font.family'] = 'SimHei' #将全局中⽂字体改为⿊体img0 = cv2.imread('E:\From Zhihu\For the desk\cvseven.jpeg')img1 = cv2.cvtColor(img0, cv2.COLOR_BGR2GRAY)h, w = img1.shape[:2]print(h, w)dWindow("W0")cv2.imshow("W0", img0)cv2.waitKey(delay = 0)#绘制直⽅图hist = cv2.calcHist([img0], [0], None, [256], [0, 255])plt.plot(hist, color = 'lime', label = '蓝⾊通道直⽅图', linestyle = '--', alpha = 1)plt.legend()plt.savefig('E:\From Zhihu\For the desk\cvseven1.jpeg')plt.show()上图就是对蓝⾊通道绘制的直⽅图3. 掩膜直⽅图(1)基本概念如果我们不需要整幅图像中的直⽅图,⽽是某个区域的直⽅图,我们只需要绘制⼀幅图,将需要统计的部分设置为⽩⾊,不需要统计的部分设置为⿊⾊,就构成了⼀幅掩膜图像(2)实现代码得到掩模图##得到掩膜图mask = np.zeros(img0.shape, np.uint8) #将每⼀个像素点设置为0,就是⿊⾊mask[109:309, 212:412] = 255 #选取特定区域设置为⽩⾊img0_1 = cv2.bitwise_and(img0, mask) #图像与操作得到掩膜图dWindow("W1")cv2.imshow("W1", img0_1)cv2.waitKey(delay = 0)绘制掩膜直⽅图#绘制掩膜直⽅图##得到掩膜图mask = np.zeros(img1.shape, np.uint8) #将每⼀个像素点设置为0,就是⿊⾊mask[109:309, 212:412] = 255 #选取特定区域设置为⽩⾊img1_1 = cv2.bitwise_and(img1, mask) #图像与操作得到掩膜图dWindow("W1")cv2.imshow("W1", img1_1)cv2.waitKey(delay = 0)##绘制掩膜直⽅图和部分图像直⽅图hist1 = cv2.calcHist([img1], [0], mask, [256], [0, 255]) #掩膜图直⽅图,参数需要修改hist2 = cv2.calcHist([img1], [0], None, [256], [0,255])plt.plot(hist1, color = 'b', label = '掩膜直⽅图', linestyle = '--')plt.plot(hist2, color = 'r', label = '原图直⽅图', linestyle = '-.')plt.legend()plt.savefig('E:\From Zhihu\For the desk\cvseven2.jpeg')plt.show()得到的图像如下:4. H-S 直⽅图(1)基本概念H(Hue) - S(Saturation) 直⽅图,即⾊调 - 饱和度直⽅图绘制该直⽅图需要将源RGB图像转化到 HSV (⾊调、饱和度、亮度)颜⾊空间中去img0_2 = cv2.cvtColor(img0, cv2.COLOR_BGR2HSV) #将 RGB 空间转化为 HSV 空间dWindow("W2")cv2.imshow("W2", img0_2)cv2.waitKey(delay = 0)(2)绘制⼆维H-S直⽅图此处参考:##绘制H-S直⽅图hist3 = cv2.calcHist ([img0_2], [0, 1], None , [180, 256], [0, 180, 0, 256])#官⽹给出的解释:channel = [0,1] 因为我们需要同时处理 H 和 S 平⾯;bins = [180,256] H 平⾯为 180,S 平⾯为 256;range = [0,180,0,256] ⾊调值介于 0 和 180 之间,饱和度介于 0 和 2 plt.imshow(hist3)plt.savefig('E:\From Zhihu\For the desk\cvseven3.jpeg')plt.show()得到的图像如下:上图中的 X 轴代表S(饱和度),Y轴代表H(⾊调)该图中的峰值主要分布在 S 在(0-50)之间 H在(20-80),⾄于为什么峰值较少,个⼈猜测是由于原图中的⾊彩变化不明显,导致没办法绘制出过多过明显的峰值到此这篇关于Python+OpenCV图像处理之直⽅图统计的⽂章就介绍到这了,更多相关Python OpenCV直⽅图统计内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
C++彩色图像(RGB)三通道直方图计算和绘制,图像逆时针旋转90°实现代码
C++彩⾊图像(RGB)三通道直⽅图计算和绘制,图像逆时针旋转90°实现代码1 #include "iostream"2 #include "opencv2/opencv.hpp"3 #include "vector"45using namespace std;6using namespace cv;78/*计算真彩⾊图像的直⽅图*/9void splitRgbImgPro(const Mat img, vector<Mat>& imgRGB);10void calImgHistPro(vector<Mat> imgrgb, vector<vector<int>>& histData);11void showImgHistPro(vector<vector<int>>& histD);12void rotateImgPro(Mat& img, float angle);13int main()14 {15 Mat imgSrc = imread("E:\\VideoPlateRecog\\ETC\\1008\\SRC\\144.bmp");16/*⾊彩空间分离*/17 vector<Mat> imgRGB;18 splitRgbImgPro(imgSrc, imgRGB);19/*计算三通道直⽅图*/20 vector<vector<int>> histData;21 calImgHistPro(imgRGB, histData);22/*绘制三通道直⽅图*/23 showImgHistPro(histData);2425 system("pause");26return0;27 }2829void calImgHistPro(vector<Mat> imgrgb,vector<vector<int>>& histData)30 {31 vector<Mat> imgrgbSrc = imgrgb;32int width = imgrgb[0].cols;33int height = imgrgb[0].rows;34for (int n = 0; n < imgrgb.size(); n++)35 {36 Mat imgSrc = imgrgbSrc[n].clone();37int img_sum = -1;38 vector<int> p(256);39for (int m = 0; m <p.size() ; m++)40 {41 p[m] = 0;42 }43for (int i = 0; i < height; i++)44 {45 uchar* ptr = imgSrc.ptr<uchar>(i);46for (int j = 0; j < width; j++)47 {48int k = ptr[j];49 p[k]++;50 }51 }52/*find max element of vector*/53for (auto it = p.begin(); it != p.end(); it++)54 {55if (*it > img_sum)56 {57 img_sum = *it;58 }59 }60for (int m = 0; m < 256; m++)61 {62 p[m] = p[m]*255 / img_sum;63 }64 histData.push_back(p);65 }66 }6768void showImgHistPro(vector<vector<int>>& histD)69 {70 vector<vector<int>> histSrc=histD;71int cols = histD[0].size();72int rows = -1;73 Mat histRGB(cols , cols * 3, CV_8UC1, Scalar(0));74for (int n = 0; n < histD.size(); n++)75 {76 vector<int> hist = histD[n];77 Mat histImg(cols, cols, CV_8UC1, Scalar(0));78for (int i = 0; i < cols; i++)79 {80 uchar* ptr = histImg.ptr(i);81for (int j = 0; j < hist[i]; j++)82 {83 ptr[j] = 255;84 }85 }86/*旋转90°*/87 Mat histImg1(cols, cols, CV_8UC1, Scalar(0));88for (int l = 0; l < cols; l++)89 {90for (int k = 0; k < cols; k++)91 {92 histImg1.at<uchar>(l, k) = histImg.at<uchar>(k, cols-l-1);93 }94 }95 histImg1.copyTo(histRGB(Rect(cols*n,0, cols, cols)));96 }97 imshow("Img_R_G_B", histRGB);98 waitKey(0);99 }100101void rotateImgPro(Mat& img,float angle)102 {103 Mat retMat(img.cols, img.rows, CV_8UC1, Scalar(0));104float anglePI = (float)(angle*CV_PI / 180);105int xSm, ySm;106for (int i = 0; i < retMat.rows; i++)107 {108for (int j = 0; j < retMat.cols; j++)109 {110 xSm = (int)((i - retMat.rows / 2)*cos(anglePI) -111 (j - retMat.cols / 2)*sin(anglePI) + 0.5);112 ySm = (int)((i - retMat.rows / 2)*sin(anglePI) +113 (j - retMat.cols / 2)*cos(anglePI) + 0.5);114 retMat.at<uchar>(i, j) = img.at<uchar>(xSm, ySm); 115116 }117 }118 }119120121122123void splitRgbImgPro(const Mat img, vector<Mat>& imgRGB)124 {125 Mat imgSrc = img.clone();126int width = imgSrc.rows;127int height = imgSrc.cols;128 Mat imgR(width, height, CV_8UC1);129 Mat imgG(width, height, CV_8UC1);130 Mat imgB(width, height, CV_8UC1);131for (int i = 0; i < width; i++)132 {133 Vec3b* imgPtr = imgSrc.ptr<Vec3b>(i);134 uchar* imgSPtr = imgSrc.ptr<uchar>(i);135 uchar* imgRPtr = imgR.ptr<uchar>(i);136 uchar* imgGPtr = imgG.ptr<uchar>(i);137 uchar* imgBPtr = imgB.ptr<uchar>(i);138for (int j = 0; j < height; j++)139 {140 imgRPtr[j] = imgSPtr[0];141 imgGPtr[j] = imgSPtr[1];142 imgBPtr[j] = imgSPtr[2];143 imgSPtr += 3;144 }145 }146 imgRGB.push_back(imgR);147 imgRGB.push_back(imgG);148 imgRGB.push_back(imgB);149 }。
关于信源熵的实验报告讲解
实验报告实验名称关于信源熵的实验课程名称信息论与编码姓名xxx 成绩90班级电子信息1102学号**********日期2013.11.22地点综合实验楼实验一关于信源熵的实验一、实验目的1. 掌握离散信源熵的原理和计算方法。
2. 熟悉matlab 软件的基本操作,练习使用matlab 求解信源的信息熵。
3. 自学图像熵的相关概念,并应用所学知识,使用matlab 或其他开发工具求解图像熵。
4. 掌握Excel的绘图功能,使用Excel绘制散点图、直方图。
二、实验原理1. 离散信源相关的基本概念、原理和计算公式产生离散信息的信源称为离散信源。
离散信源只能产生有限种符号。
随机事件的自信息量I(xi)为其对应的随机变量xi 出现概率对数的负值。
即: I (xi )= -log2p ( xi)随机事件X 的平均不确定度(信源熵)H(X)为离散随机变量 xi 出现概率的数学期望,即:2.二元信源的信息熵设信源符号集X={0,1} ,每个符号发生的概率分别为p(0)= p,p(1)= q,p+ q =1,即信源的概率空间为:则该二元信源的信源熵为:H( X) = - plogp–qlogq = - plogp –(1 - p)log(1- p)即:H (p) = - plogp –(1 - p)log(1- p) 其中 0 ≤ p ≤13. MATLAB二维绘图用matlab 中的命令plot( x , y) 就可以自动绘制出二维图来。
例1-2,在matlab 上绘制余弦曲线图,y = cos x ,其中 0 ≤ x ≤2。
>>x =0:0.1:2*pi; %生成横坐标向量,使其为 0,0.1,0.2,…,6.2>>y =cos(x ); %计算余弦向量>>plot(x ,y ) %绘制图形4. MATLAB求解离散信源熵求解信息熵过程:1) 输入一个离散信源,并检查该信源是否是完备集。
用MATLAB统计图像直方
02
imhist(I); % 计算并显示归一化直方图
03
```
04
直方图均衡化
直方图均衡化的定义
直方图均衡化是一种图像处理技术, 通过对图像的灰度直方图进行变换, 改善图像的对比度,增强图像的细节 和清晰度。
通过扩展图像的灰度级别范围,使得 图像的细节更加突出,提高图像的可 视化效果。
Matlab实现直方图均衡化
01 使用Matlab中的`histeq`函数,可以对图 像进行直方图均衡化处理。
02 首先,读取图像文件并将其转换为灰度图 像。
03
然后,使用`histeq`函数对灰度图像进行直 方图均衡化处理。
04
最后,显示处理后的图像。
直方图均衡化的效果
01
02
03
直方图均衡化可以显著 改善图像的对比度,增 强图像的细节和清晰度
彩色图像直方图
示例代码
1
```matlab
2
3
I = imread('image.jpg'); % 读取彩色图像
彩色图像直方图
imhist(I); % 计算并显示彩色直方图 ```
归一化直方图
归一化直方图
归一化直方图是一种将像素值范围限制在特定范围内的直方图,可以更好地反映图像的细节和特征。 在Matlab中,可以使用`imhist`函数计算归一化直方图。
直方图可以用于提取图像中的特征,如边缘、纹理等,也可以用于 图像分割,将图像划分为不同的区域。
直方图的计算方法
01
累积直方图
02
归一化直方图
首先计算原始直方图,然后将每个像 素强度值的频数累加起来,得到累积 直方图。累积直方图可以用于快速查 找特定像素强度值的范围。
信息熵与图像熵的计算
实验一信息熵与图像熵计算一、实验目的1.复习MATLAB 的基本命令,熟悉MATLAB 下的基本函数。
2.复习信息熵基本定义, 能够自学图像熵定义和基本概念。
二、实验仪器、设备1.计算机-系统最低配置 256M 内存、P4 CPU。
2.Matlab 仿真软件- 7.0 / 7.1 / 2006a 等版本Matlab 软件。
三、实验内容与原理(1)内容:1.能够写出MATLAB 源代码,求信源的信息熵。
2.根据图像熵基本知识,综合设计出MATLAB 程序,求出给定图像的图像熵。
(2)原理1. MATLAB 中数据类型、矩阵运算、图像文件输入与输出知识复习。
2.利用信息论中信息熵概念,求出任意一个离散信源的熵(平均自信息量)。
自信息是一个随机变量,它是指某一信源发出某一消息所含有的信息量。
所发出的消息不同,它们所含有的信息量也就不同。
任何一个消息的自信息量都代表不了信源所包含的平均自信息量。
不能作为整个信源的信息测度,因此定义自信息量的数学期望为信源的平均自信息量:信息熵的意义:信源的信息熵H是从整个信源的统计特性来考虑的。
它是从平均意义上来表征信源的总体特性的。
对于某特定的信源,其信息熵只有一个。
不同的信源因统计特性不同,其熵也不同。
3.学习图像熵基本概念,能够求出图像一维熵和二维熵。
图像熵是一种特征的统计形式,它反映了图像中平均信息量的多少。
图像的一维熵表示图像中灰度分布的聚集特征所包含的信息量,令Pi 表示图像中灰度值为i的像素所占的比例,则定义灰度图像的一元灰度熵为:255log i iip p ==∑H图像的一维熵可以表示图像灰度分布的聚集特征,却不能反映图像灰度分布的空间特征,为了表征这种空间特征,可以在一维熵的基础上引入能够反映灰度分布空间特征的特征量来组成图像的二维熵。
选择图像的邻域灰度均值作为灰度分布的空间特征量,与图像的像素灰度组成特征二元组,记为( i, j ),其中i 表示像素的灰度值(0 <= i <= 255),j 表示邻域灰度(0 <= j <= 255),2(,)/ijP f i j N =上式能反应某像素位置上的灰度值与其周围像素灰度分布的综合特征,其中f(i, j) 为特征二元组(i, j)出现的频数,N 为图像的尺度,定义离散的图像二维熵为:255logij ijip p ==∑H构造的图像二维熵可以在图像所包含信息量的前提下,突出反映图像中像素位置的灰度信息和像素邻域内灰度分布的综合特征.四、实验步骤1.求解信息熵过程:1) 输入一个离散信源,并检查该信源是否是完备集。
图像霍夫曼编码与解码以及熵,平均码长,冗余度的计算
DIP上机报告题目:数字图像处理上机报告(第4次)学校:中国地质大学(武汉)***师:****名:**班级序号: 071112-06目录1图像霍夫曼编码与解码以及熵,平均码长,冗余度的计算错误!未定义书签。
2上机小结 (10)注:给定的文件夹中只需运行test脚本就可以得到结果,从workspace中看到相应的数据4.2图像的霍夫曼编码与解码题目要求:对图2实施哈夫曼编码和解码,计算图象熵,平均码长和冗余度;算法设计:1.遍历图像,统计各个像素灰度值的概率2.找出概率最小的两个,在最小概率所代表的灰度值编码中加1,在另一个较小的概率所代表的灰度值编码中加03.合并两个概率,成为一个新的元素,如此重复下去,直到最后剩两个元素4.进行编码的逆过程,即解码过程5.计算相应的数据程序代码:运行代码:clearin=[2,2,3,5,0,0,5,5,5,4,1,1,2,2,1,5,4,6,5,5,7,2,2,3,5,2,2,2,3,4,4,4,6,2,1,4,1,1,2,2,1,5,7,6,5,5,7,2,2,4,4,1,2,2,1,5,2,3,1,2,2,1,5,0];[p,out] = gailv( in );[code] = Huffman(0:7,p); %进行霍夫曼编码[Coded_Img]=Encode(in,code); %对图像进行编码[H,L,R]=GetInfo(code); %计算熵、平均码长、冗余度[Img]=Decode(Coded_Img,code); %对图像进行解码图像各像素灰度的概率计算:function[ p,out ]=gailv( in )[M,N]=size(in);out = zeros(4,8);p = zeros(1,8);for i=1:8out(1,i)=i-1;endfor i=1:Mfor j=1:Nfor k=1:8if in(i,j) == out(1,k)out(2,k)=out(2,k)+1;endendendendfor i=1:8out(3,i)=out(2,i)/(M*N);p(1,i)=out(2,i)/(M*N);endend霍夫曼编码过程:function [code_out] = Huffman(s,p)[Ms,Ns]=size(s);if (Ms==1)sig=s';elsesig=s;end%s为各元素名称 p为各元素概率[Ms,Ns]=size(sig);[Mp,Np]=size(p);if (Ms~=Np)return;endcode=cell(Ms,4);%建立编码cellcode_out=cell(Ms,3);%建立输出cellcoding=cell(Ms,2);%建立编码过程中用到的cellfor i=1:Mscode{i,1}=sig(i,:);%第一列为元素名称code{i,2}=[];%第二列为编码code{i,3}=p(i);%第三列为元素概率code{i,4}=[];%第四列为元素概率排行coding{i,1}=p(i);%第一行为元素概率coding{i,2}=i;%第二行表示此概率由哪些元素组成end[m,l]=Cell_min(coding(:,1));%找出最小值while (m<1)%若最小值小于1(编码尚未完成)[m1,l1]=Cell_min(coding(:,1));%找出最小值temp_p=coding{l1,1};%记录下最小概率coding{l1,1}=2;%将概率改为2,则以后不会再次取到[m2,l2]=Cell_min(coding(:,1));%找出次小值coding{l2,1}=coding{l2,1}+temp_p;%最小概率和次小概率相加得到新元素概率[k,mp]=size(coding{l1,2});%考虑最小概率包含了哪些元素for i=1:mpcode{coding{l1,2}(i),2}=[1,code{coding{l1,2}(i),2}];%在这些元素的编码前加1end[k,mp]=size(coding{l2,2});%考虑次小概率包含了哪些元素for i=1:mpcode{coding{l2,2}(i),2}=[0,code{coding{l2,2}(i),2}];%在这些元素的编码前加0endcoding{l2,2}=[coding{l2,2},coding{l1,2}];%新元素包含了次小和最小元素包含的所有元素[m,l]=Cell_min(coding(:,1));%找出当前最小值,继续循环endfor i=1:Mscode_out(i,1:3)=code(i,1:3);%输出cell前3列等于编码cell前3列end求概率的最小值函数:function [mind,loc]=Cell_min(data)%找出cell中的某列元素的最小值和位置[M,N]=size(data);loc=-1;for i=1:Md(i)=data{i}(1,1);endturemin=min(d);%找出最小值for i=1:M %遍历矩阵,找出最小值所在位置if (d(i)==turemin)mind=d(i);loc=i;return;endendend图像编码代码:function [Coded_Img]=Encode(img,code)%遍历图像,查表确定码字[M,N]=size(img);[Mc,Nc]=size(code);Coded_Img=cell(M,N);for i=1:Mfor j=1:Ndata=img(i,j);for k=1:Mcif (code{k,1}==data)Coded_Img{i,j}=code{k,2};endendendendend图像解码代码:function [img]=Decode(Coded_Img,code)%遍历编码图像,查表确定数值[M,N]=size(Coded_Img);[Mc,Nc]=size(code);for i=1:Mfor j=1:Ndata=Coded_Img{i,j};for k=1:Mcif(size(data)==size(code{k,2}))if (code{k,2}==data)img(i,j)=code{k,1};endendendendendend相关数据的计算:function [H,L,R]=GetInfo(code)[M,N]=size(code);H=0;for i=1:MH=H+code{i,3}*log2(1/code{i,3});end%计算熵L=0;for i=1:M[m,n]=size(code{i,2});L=L+code{i,3}*n;end%计算平均码长R=L/H-1;%计算冗余度end运行结果:编码前图像:编码后图像:解码后图像:熵(H)、平均码长(L)、冗余度(R)至此,成功实现了图像矩阵的编码和解码以及相关参数的计算。
数字图像实验 图像直方图分析1234
试验三:图像直方图分析一·实验目的1.掌握VC++6.0图像编程的基本操作2. 应用VC++6.0编程绘制灰度直方图。
二·实验内容1.用VC++6.0绘制灰度直方图;2. 对图像进行直方图分析。
三·实验步骤(1)启动VC++6.0,打开Dip工程。
(2)将Pointpro.h、Pointpro.cpp文件及Areapro.h、Areapro.cpp文件拷贝到当前工程目录文件里面。
(3)在Fileview-->Dipfiles→右键→Setting→Link→添加Pointpro.h、Pointpro.cpp 文件及Areapro.h、Areapro.cpp文件。
(4)在菜单栏→insert→resouce→dialog→new,在对话框模版的非控制区点击鼠标右键,在弹出的对话框中选properties,设置为ID:IDD_DLG_Intensity,C标题:Histogram,关闭属性对话框,回到“建立类向导”(MFC classwizard),在弹出的对话框中选创建新类CDlgIntensity后确定。
并且在FileView中修改DlgIntensity.cpp和DlgIntensity.h相应的代码;(5)在弹出的对话框中,添加如下的按钮等控件:例如右键单击上面最大的静态文本,在弹出的对话框中选“属性”,在属性对话框中添加如下内容:(6)在ResourceView栏中→Menu→选IDR_DIPTYPE ,如图在View菜单栏下空的一栏中,右键鼠标,在弹出的对话框中选属性properties,在弹出的对话框中,设置:ID:ID_VIEW_HIST,标题为Histogram,在建立的类向导中选类为CDlgIntensity,确定。
(7)在StdAfx.h中添加#include<math.h>(8)在DipView.h中//{{AFX_MSG(CDipView)下添加afx_msg void OnViewHist();afx_msg void OnUpdateViewHist(CCmdUI* pCmdUI); (9)DipView.cpp添加#include "PointPro.h"和#include "DlgIntensity.h",在BEGIN_MESSAGE_MAP(CDipView, CScrollView)处添加:ON_COMMAND(ID_VIEW_HIST, OnViewHist)ON_UPDATE_COMMAND_UI(ID_VIEW_HIST, OnUpdateViewHist) 在// CDipView message handlers下面添加:void CDipView::OnViewHist(){CDipDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);//判断当前是否有图像对象if( pDoc->m_pDibObject == NULL ) return;//在点处理CPointPro类中创建用来绘制直方图的数据CPointPro PointOperation( pDoc->m_pDibObject );int *pHistogram = PointOperation.GetHistogram();//生成一个对话框CHistDlg类的实例CDlgIntensity HistDlg;//将绘制直方图的数据传递给CHistDlg对话框类的公有成员变量m_pnHistogramif( pHistogram != NULL ){//设置直方图数据指针HistDlg.m_pnHistogram = pHistogram;//设置当前像素值为0的像素数HistDlg.m_nCurrentPiexsNum = pHistogram[0];//设置是否为256级灰度图像HistDlg.m_bIsGray256 = PointOperation.IsGray256();}//显示对话框if ( HistDlg.DoModal() != IDOK)return;delete [] pHistogram;}void CDipView::OnUpdateViewHist(CCmdUI* pCmdUI){CDipDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);pCmdUI->Enable( pDoc->m_pDibObject->GetNumBits() >= 8);}(10)在DipDoc.h中添加:protected:long m_lHeight;long m_lWidth;(11)在DipDoc.cpp中添加菜单命令:#include "AreaPro.h",在CDipDoc::CDipDoc()下面添加{m_pDibObject = NULL;m_bImageLoaded = FALSE;// TODO: add one-time construction code herem_lHeight = 0;m_lWidth = 0;}在最下面添加:void CDipDoc::OnFileSaveAs(){// TODO: Add your command handler code herestatic int nIndex = 1;CFileDialog DialogSaveAs( FALSE, NULL, m_pDibObject->GetImageName(),OFN_HIDEREADONLY, szFilter );DialogSaveAs.m_ofn.nFilterIndex = (DWORD) nIndex;if( DialogSaveAs.DoModal() == IDOK ){CMainFrame *pMainFrame = ( CMainFrame * )AfxGetMainWnd();CChildFrame *pChildFrame = ( CChildFrame * )pMainFrame->MDIGetActive();CDipView *pDipView = ( CDipView * )pChildFrame->GetActiveView();nIndex = (int) DialogSaveAs.m_ofn.nFilterIndex;if( nIndex == 5 ){if( m_pDibObject->GetNumBits() != 24 ){AfxMessageBox("必须是24位真彩色图像才能存为JPEG格式!");return;}}if( m_pDibObject != NULL ){CString strPathName = DialogSaveAs.GetPathName();int nFindIndex = strPathName.Find(".");if( nFindIndex != -1)strPathName = strPathName.Left( nFindIndex );strPathName += CDibObject::szExtensions[ nIndex - 1 ];//m_pDibObject->ProcessImageHeader();//m_pDibObject->ProcessPalette();m_pDibObject->Save( strPathName );CString strFileName = DialogSaveAs.GetFileName();nFindIndex = strFileName.Find(".");if ( nFindIndex != -1 )strFileName = strFileName.Left( nFindIndex );strFileName += CDibObject::szExtensions[ nIndex - 1 ];pChildFrame->SetWindowText( strFileName );SetPathName( strPathName );if( nIndex == 5 ){m_pDibObject->Load( strPathName );pDipView->InvalidateRect( NULL, FALSE );pDipView->UpdateWindow();}}}}(12)在ChildFrm.h中添加public:CChildFrame();int m_nWidth, m_nHeight;(13)在ChildFrm.cpp中添加CChildFrame::CChildFrame(){m_nWidth = 300;m_nHeight = 150;}在BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs)添加:{// TODO: Modify the Window class or styles here by modifying// the CREATESTRUCT cscs.cx = m_nWidth;cs.cy = m_nHeight;if( !CMDIChildWnd::PreCreateWindow(cs) ) return FALSE;return TRUE;}一、实验结果二、实验心得及体会通过做这次实验,使我又学到了关于图像直方图的知识,进一步掌握了图像编程的基本操作:会应用VC++6.0编程绘制灰度直方图。
计算图像的直方图
南通大学计算机科学与技术学院《数字图像处理》课程实验报告书实验名计算图像的直方图班级计 121姓名张进学号 12130220162014年6月 16 日一、实验内容1、打开一张图,计算其直方图。
二、图像直方图的概念图像直方图是反映一个图像像素分布的统计表,其实横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的。
纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比。
图像是由像素构成,因为反映像素分布的直方图往往可以作为图像一个很重要的特征。
在实际工程中,图像直方图在特征提取、图像匹配等方面都有很好的应用。
三、灰度直方图的计算1、灰度直方图的定义灰度直方图是灰度级的函数,描述图像中该灰度级的像素个数(或该灰度级像素出现的频率):其横坐标是灰度级,纵坐标表示图像中该灰度级出现的个数(频率)。
一维直方图的结构表示为高维直方图可以理解为图像在每个维度上灰度级分布的直方图。
常见的是二维直方图。
如红-蓝直方图的两个分量分别表示红光图像的灰度值和蓝光图像灰度值的函数。
其图像坐标(Dr,Db)处对应在红光图像中具有灰度级Dr同时在蓝光图像中具有灰度级Db的像素个数。
这是基于多光谱——每个像素有多个变量——的数字图像,二维中对应每个像素统计个变量。
简单的说,直方图就是对数据进行统计,将统计值组织到一系列事先定义好的bin中。
bin的数值是从数据中计算出的特征的统计量,这些数据可以是诸如梯度,方向,色彩或者任何其他特征。
无论如何,直方图获得的是数据分布的统计图。
通常直方图的数据要低于原始数据。
由于原始数据点可以表征任何事情,所以直方图实际上是一个方便表示图像特征的手段。
2、灰度直方图的计算对于彩色图像的R、G、B各彩色分量取反的技术就是图像的反色处理,这在处理二值化图像的连通区域选取的时候非常重要。
如物体连通域用黑色表示,而二值化后的物体连通域图像可那是白色的,而背景是黑色的,这时应手动选取图像的反色处理或有程序根据背景和物体连通域两种颜色的数量所占比例而自动选择是否选择选取图像的反色处理int main(){Mat Image=imread("../cat.png");cvtColor(Image,Image,CV_BGR2GRAY);const int channels[1]={0};const int histSize[1]={256};float hranges[2]={0,255};const float* ranges[1]={hranges};MatND hist;calcHist(&Image,1,channels,Mat(),hist,1,histSize,ranges);return 0;}3、彩色直方图计算int main(){Mat Image=imread("../cat.png");const int channels[3]={0,1,2};const int histSize[3]={256,256,256};float hranges[2]={0,255};const float* ranges[3]={hranges,hranges,hranges};MatND hist;calcHist(&Image,1,channels,Mat(),hist,3,histSize,ranges);return 0;}4、不均匀直方图分别统计0-50,50-80,80-150,150-230,230-255区间的灰度分布:int main(){Mat Image=imread("../cat.png");cvtColor(Image,Image,CV_BGR2GRAY);const int channels[1]={0};int histSize[1]={5};float hranges[6]={0,50,80,150,230,255};const float* ranges[1]={hranges};MatND hist;calcHist(&Image,1,channels,Mat(),hist,1,histSize,ranges,false);return 0;}四、直方图的显示直方图计算得到的实际上是一个多维数组,这并不够直观,我们希望能够像在Excel中把相关数据通过表的形式表示出来。
基于图像熵和分块直方图的图像检索技术研究
安 阳工 学 院学 报
J o u na r l o f An y a n g I n s t i t u t e o f T e c h n o l o g y
No v . 2 0 1 3
第 1 2 卷 第 6 期( 总第 6 6期 e n . N o . 6 6 )
调 ,是 从 一 个 物体 反 射 过来 的或 透 过 物体 的光 波 随着 互联 网络 的发展 , 图像 数 据越 来 越 大 。而 长 , 更一般的 , 色调 是 由颜色 名 称 来辨 别 的 , 如红 、 传 统 的图像 检 索 技 术 是基 于 文 本 ,基 于 文本 的检 橙 、 黄、 绿、 蓝、 靛、 紫 等 。一 1 8 0  ̄ - 1 8 0 。 或0 0 - 3 6 0 o 度 索 工 作 量很 大 , 而且 由于 人 为参 与 的 主观 性 。 影 响 量 , 对应与颜色轮 c o l o r w h e e 1 ) 上 的 角度 ; S a t u r a t i o n 了检 索 的性 能 。到 2 O世 纪 9 0年代 以后 , 出现 了对 表示 颜 色 的饱 和度 。 即表示 一 种 颜 色 中加 入 了多 图像 的 内容 语 义 , 如 图 像 的颜 色 、 纹理 、 布 局 等 进 少 白光 , 反 映颜 色 被 白色 冲 淡 的程 度 , 通 常 用 百 分 行 分 析 和 检索 的 图像检 索 技 术 .即 基 于 内容 的 图 比来 度 量 ,从 0 %到完 全 饱 和 的 1 0 0 %; V a l u e表 示 像检索( C o n t e n t — b a s e d I ma g e R e t r i e v a l , 简称 C B I R) 亮度 , 是颜 色 的明 暗程 度 , 它 也 用 百 分 比度 量 从 黑 技 术 。在基 于 内容 的 图像检 索 中 。 颜 色作 为 图像 最 0 %到 白 1 0 0 %。 由 于色 调 H是 以 0  ̄ - 3 6 0 。 角度 度 显 著 的视觉 特 征 。 被广 泛应 用 于 图像 检 索 。颜色 特 量 , 因此 由 日 和 . s 量 可 以构 造 一个颜 色 轮 。在颜 色 征 具 有稳 定 性 好 、 计 算 简单 等 特 征 。其 中 , 颜 色 直 轮 上 , 主要 颜 色沿 一 个 圆 均匀 分 布 , 次 要 颜 色 位 于 方 图 是 颜 色特 征 的 常用 描 述 方 法 ,但 在 对 彩 色 图 主要 颜色 之 间 。例 如用 黄 色和 青色 产生 绿色 。 因此 像 进 行检 索 时 ,颜 色直 方 图仅 仅 表示 了 图像 中各 绿 色 位 于 黄 色和 青 色 之 间 。每 种 颜 色与 它 的补 色 种 颜 色 的统 计 分 布 .而 没 有 包 含颜 色 的空 间分 布 直 接 在轮 上相 对 。长轴 表 示亮 度 , 离 开 长轴 的方 信 息 。两 个 颜 色 直方 图相 似 的 图像 由于 颜 色 空 间 向表 示 饱 和度 I s ,这样 H S V颜 色 空 间就 可 以简单 分 布差 别很 大 , 图像 的内容 可能 相差 很 多 。这些 都 地 用一 个倒 置 的 圆锥表 示 了 。 H S V颜 色模 型 的有 是 造成 检 索 效 果不 理 想 的 原 因 。本 文 采 用 了可 以 两 个 特 点 : 第一 , 各分量在视觉上彼此无关 , 相 互 直 接作 用 于 彩 色 图像 的 图 像熵 .表 征 图像 的 整体 独 立 ; 第二 , 空 间距 离 符 合 人 眼 的视 觉 特 征 , 适 合 颜 色信 息 和邻 域 内颜 色 空 间分 布 ,然 后 再 结 合颜 度 量 。从 而 使 得 它非 常 适合 于借 助 人 类 视 觉 系统 色直 方 图进 行检 索 。结果 证 明 。 该 方法 不 但简 单 高 来感 知 颜 色 特 征 的 图像 处 理 算法 。该 模 型是 基 于 效。 而且 改善 了检索 的性 能 。 颜 色 的 图像 检 索方 法 的首选 模 型 。 1颜 色 空间 的选 定 2 1 _ 1 S V颜 色一 空 间的 量化 表示 图像 的颜 色 可 以 有 多种 方 法 。现 今 已经 真 彩 色( t r u e — c o l o r ) 图像 中的 每 个 像 素 值 都 分 提 出 了多 种颜 色空 间( 又 称颜 色 模 型) , 不 同的颜 色 成 、 G、 日三个 基 色分 量 ,每个 基 色分量 直 接决 定 空 间适 合 于不 同 的应用 。针 对 本 文 的 研究 我 们 采 其基 色 的强度 , 真 彩 色 图像 深 度为 2 4, 用 : G : = 8 : 用 HS V空 间模 型 。 8 : 8来表 示色 彩 , 则 、 G、 各 占用 8位来 表 示各 自 HS V颜 色模 型 [ 1 ] 是 一 种 面 向视 觉 的适 合 肉 眼 基色 分 量 的 强度 , 每个 基 色 分量 的强度 等级 为 2 s = 分 辨 的模 型 , 在基 于 内容 的 图像 检 索 中颇受 欢 迎 。 2 5 6种 。 图像 可容 纳 2  ̄ = 1 6 M 种色 彩( 2 4位 色) 。 而 人 H S V颜色 模 型 由三个 颜 色 通道 : 色调 ( Hu e ) 、 饱 和度 眼能 够 分 辨 的颜 色 非 常有 限 ,图像 中 的实 际颜 色 如 ( S a t u r a t i o n ) 、 亮度 值( V lu a e ) 组成 , H u e表 示 颜 色 色 中若 干 主 要 色 彩 覆 盖 了 图像 中 的 大 部 分 像 素 。
编程实现计算图像直方图、图像熵课件
数字图像处理实验报告——图像常用格式及显示武汉大学2016.041 实验内容本实验报告主要介绍主要内容1. 理解灰度映射原理;2. 掌握灰度映射计算方法;3. 理解图像直方图的定义;4. 理解图像直方图的作用;5. 理解图像熵的定义及作用;6. 掌握图像直方图计算方法;7. 掌握图像熵的计算方法;8. 进一步熟悉图像文件256色、24位真彩色BMP图像格式;9. 进一步熟悉Visual C++ 6.0编程界面,及使用方法;10. 熟悉Visual C++中绘图函数方法;11. 编程完成计算图像几种灰度映射;12. 编程实现计算图像直方图、图像熵;13. 编程绘制图像直方图;14. 根据不通灰度映射处理观察图像直方图变化;15. 总结实验过程(实验报告):编程、调试、结果、分析、结论。
主要目的1. 建立相关实验环境:从指定服务器指定位置拷贝实验相关材料,包括:实验要求,实例程序,示例图像,VC++6.0程序,实验相关幻灯片;2. 使用实验一建立的简单多文档应用程序框架及、图像夺取和显示功能,进一步熟悉图像的格式及显示,熟悉图像的组织和存储方式。
3. 编写图像线性灰度映射:4. 编写图像直方图统计程序:5. 观察图像直方图主要函数说明1.void CZhangyanImageView::OnProcessZhifangtu()函数目的:在用户界面中添加直方图处理,并添加函数在.cpp文件中函数参数说明:建立直方图处理函数2.void CZhangyanImageView::OnProcessLinetran()函数目的:在用户界面中添加灰度变换处理,并添加函数在.cpp文件中函数参数说明:建立灰度变换处理函数主要代码注释1.灰度变换函数代码CZhangyanImageDoc* pDoc = GetDocument();//定义引用doc的指针ASSERT_V ALID(pDoc);unsigned char * pBits=pDoc->m_pBits;//把文件中的m_pBits赋予pBitsint nWidth=pDoc->imageWidth;int nHeight=pDoc->imageHeight;//定义整形的image图片宽和高int nValue=0;double dValue=0.0;long lTotal=0;long lTotalD=0;long lTotalL=0;int ab=100,bb=255,a=0,b=255;//定义原图像的灰度值0-255范围,定义处理后图像灰度值100-255范围if(pBits==NULL) return ;//遍历完成则返回for(int i=0;i<nHeight;i++){lTotalL=nWidth*i;//统计出宽*当前高for(int j=0;j<nWidth;j++){lTotalD=lTotalL+j;//统计出第几个像素nValue=*(pBits+lTotalD);// 采用int nValue= *(m_pBits imageWidth * i+j )公式获得图像点灰度值dValue=ab+1.0*(bb-ab)/(b-a)*(nValue-a);//套用灰度变换公式pBits[lTotalD]=int(dValue);}}//对图像进行遍历与灰度处理Invalidate();//强制显示改变了的图像2.直方图生成函数m_bShow=TRUE;CZhangyanImageDoc* pDoc = GetDocument();//定义引用doc的指针ASSERT_V ALID(pDoc);unsigned char * pBits=pDoc->m_pBits; //把文件中的m_pBits图像指针赋予pBitsint nWidth=pDoc->imageWidth;int nHeight=pDoc->imageHeight; //定义整形的image图片宽和高int nValue=0;long lTotal=0;long lTotalD=0;long lTotalL=0;dMax=0;dMaxG=0;dMaxB=0;//数据初始化赋值存储图像灰度像素的计数if(pBits==NULL) return ;if(pDoc->m_nColorBits==8) //对图像进行是否是8彩色的判断{for(int k=0;k<256;k++){m_lValue[k]=0;m_dValue[k]=0.0;}for(int i=0;i<nHeight;i++){lTotalL=nWidth*i;for(int j=0;j<nWidth;j++){lTotalD=lTotalL+j;nValue=*(pBits+lTotalD);//统计灰度值m_lValue[nValue]=m_lValue[nValue]+1;//加1 }}lTotal=nWidth*nHeight;for(INT k=0;k<256;k++){m_dValue[k]=1.0*m_lValue[k]/lTotal;if(dMax<m_dValue[k]) dMax=m_dValue[k];}}//对图像进行遍历并统计直方图数据long nValueG=0;long nValueB=0;//统计R G Bif(pDoc->m_nColorBits==24) //对图像进行是否是24彩色的判断{for(int k=0;k<256;k++){m_lValue[k]=0;m_dValue[k]=0.0;m_lValueG[k]=0;m_dValueG[k]=0.0;m_lValueB[k]=0;m_dValueB[k]=0.0;//}for(int i=0;i<nHeight;i++){lTotalL=nWidth*i;for(int j=0;j<nWidth;j++){lTotalD=(lTotalL+j)*3;nValue=*(pBits+lTotalD);m_lValue[nValue]=m_lValue[nValue]+1;nValueG=*(pBits+lTotalD+1);m_lValueG[nValueG]=m_lValueG[nValueG]+1;nValueB=*(pBits+lTotalD+2);m_lValueB[nValueB]=m_lValueB[nValueB]+1;}}lTotal=nWidth*nHeight;for(int k=0;k<256;k++){m_dValue[k]=1.0*m_lValue[k]/lTotal;if(dMax<m_dValue[k]) dMax=m_dValue[k];m_dValueG[k]=1.0*m_lValueG[k]/lTotal;if(dMaxG<m_dValueG[k]) dMaxG=m_dValueG[k];m_dValueB[k]=1.0*m_lValueB[k]/lTotal;if(dMaxB<m_dValueB[k]) dMaxB=m_dValueB[k];}}//对图像进行遍历并统计直方图数据Invalidate();/强制显示改变了的图像3.变量声明void DrawGraph(CDC * pDC);//绘制直方图函数long m_lValue[256];//红色分量灰度统计double m_dValue[256];// 红色分量灰度频数long m_lValueG[256]; //绿色分量灰度统计double m_dValueG[256]; // 绿色分量灰度频数long m_lValueB[256]; //蓝色分量灰度统计double m_dValueB[256]; //蓝色分量灰度频数double dMax,dMaxG,dMaxB;//红、绿、蓝频数最大值BOOL m_bShow;//是否显示直方图4.图形绘制CZhangyanImageDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// CCCJImageDoc* pDoc 在各人的程序中不一样unsigned char * pBits=pDoc->m_pBits;int X0=0+5;int Y0=510;int WX=768+3,HY=500;int H=375;int W=256;CPen cyPen(PS_SOLID,2,RGB(255,255,0));CPen * oldPen=pDC->SelectObject(&cyPen);pDC->MoveTo(X0,Y0);pDC->LineTo(X0+WX,Y0);pDC->MoveTo(X0,Y0);pDC->LineTo(X0,Y0-HY);pDC->MoveTo(X0,Y0-HY);pDC->LineTo(X0+WX,Y0-HY);pDC->MoveTo(X0+WX,Y0);pDC->LineTo(X0+WX,Y0-HY);pDC->SelectObject(&oldPen);//设置直方图的区域{CPen redPen(PS_SOLID,1,RGB(255,0,0));oldPen=pDC->SelectObject(&redPen);for(int i=0;i<256;i++){int x0,y0,x1,y1;double dy;x0=X0+i*3;y0=Y0;x1=X0+i*3;dy=Y0-1.0*H*m_dValue[i]/dMax;y1=int(dy+0.5);pDC->MoveTo(x0,y0);pDC->LineTo(x1,y1); //进行绘图操作}pDC->SelectObject(oldPen);//以下略去对于24位的解释1.1灰度变换结果图灰度变换结果1.2图像直方图图读取图像直方图2实验日志2.1实验中遇到问题较于上次试验,本次试验显得轻车熟路许多,内容与调试也比较简单,感觉编写实验报告中遇到的最大困难就是对代码的阐述。
信息熵与图像熵的计算
信息熵与图像熵的计算信息熵是信息论中一个重要的概念,用来衡量信源中包含的信息量。
而图像熵是在图像处理中引入的概念,用来衡量图像中的信息量。
1.信息熵的概念信息熵是用来度量一个信源的平均信息量的,也可以看作是随机变量的不确定性的度量。
信息熵的计算公式如下:H(X) = -Σ(p(x) * log2(p(x)))其中,X表示一个离散型的信源,p(x)表示X取值为x的概率。
计算信息熵的步骤如下:1)统计信源中每个离散值出现的概率;2)根据计算出的概率值,计算每个离散值的信息量;3)将每个离散值的信息量相加,即可以得到信源的信息熵。
2.图像熵的概念图像熵是用来衡量图像中信息量的一个指标。
在图像处理中,图像熵用来描述图像的纹理复杂程度,即图像中包含的信息量。
图像熵的计算公式如下:H(I) = -Σ(p(i) * log2(p(i)))其中,I表示一个图像,p(i)表示图像中像素值为i的概率。
计算图像熵的步骤如下:1)统计图像中每个像素值出现的概率;2)根据计算出的概率值,计算每个像素值的信息量;3)将每个像素值的信息量相加,即可以得到图像的熵。
3.信息熵与图像熵的比较信息熵和图像熵的计算方法相似,但是在具体的应用场景中存在一些差别。
首先,信息熵是用来度量信源的不确定性,所以信源可以是任意类型的数据,包括离散型信源和连续型信源。
而图像熵是针对图像数据的一种度量,因此信源是离散型的。
其次,图像熵主要用来衡量图像的纹理复杂程度,所以在计算图像熵时,通常会将图像转化为灰度图像。
这样做的目的是忽略图像的颜色信息,只关注亮度信息,因为在大多数场景下,图像的颜色信息对于图像的信息量没有太大的贡献。
此外,信息熵和图像熵的计算结果都是一个非负数,越大表示信息量越大,越小表示信息量越少。
当信息熵或图像熵为0时,表示信源或图像中只有一个确定的值,没有任何信息的不确定性。
总结来说,信息熵和图像熵都是衡量信息量的一种指标,用来描述数据的不确定性或者纹理复杂程度。
编程实现计算图像直方图、图像熵课件
//以下略去对于 24位的解释
5
1.1 灰度变换结果
1.2 图像直方图
图 灰度变换结果
6
图 读取图像直方图
2 实验日志
2.1 实验中遇到问题
较于上次试验, 本次试验显得轻车熟路许多, 内容与调试也比较简单, 感觉编写 实验报告中遇到的最大困难就是对代码的阐述。 C++中指针是比较难的,再加上 vs开发中结构架构的重叠,各种的声明,比较复杂,仔细的阅读了懂得了 int nValue= *( m_pBits imageWidth * i +j )代表了灰度值的获取,再结合灰度 变换的公式, 就很快清楚了进行灰度变换函数的意思, 对于直方图数据采集中出 现的很多变量感觉不好理解,对于 DrawGraph函数绘制的理解还是比较弱的,希望 下次实验时让学长来解疑答惑, 总之, 这次试验按部就班的成功完成, 要尽力完 善一下自己对 c++的理解,获益匪浅。
1
int nValue=0; double dValue=0.0; long lTotal=0; long lTotalD=0; long lTotalL=0;
int ab=100,bb=255,a=0,b=255/;/定义原图像的灰度值 0-255范围,定义处理后 图像灰度值 100-255范围
} } //对图像进行遍历与灰度处理
Invalidate();//强制显示改变了的图像 2.直方图生成函数 m_bShow=TRUE;
CZhangyanImageDoc* pDoc = GetDocument();//定义引用 doc的指针 ASSERT_VALID(pDoc); unsigned char * pBits=pDoc->m_pBits; //把文件中的 m_pBits图像指针赋予 pBits int nWidth=pDoc->imageWidth; int nHeight=pDoc->imageHeight; //定义整形的 image图片宽和高 int nValue=0; long lTotal=0; long lTotalD=0; long lTotalL=0;
图形图像编码中的熵编码算法使用教程
图形图像编码中的熵编码算法使用教程在图形图像编码中,熵编码算法是一种常用的数据压缩技术。
通过对图像中的数据进行编码,可以减小图像所占用的存储空间,提高传输效率。
本文将介绍图形图像编码中的熵编码算法的使用教程,并详细解释其原理和操作步骤。
熵编码是一种无损压缩方法,它通过使用较短的位数来表示频率较高的符号,以实现数据的压缩。
在图形图像编码中,熵编码通常用于对图像中的颜色或像素值进行编码。
首先,我们需要了解熵编码的原理。
熵编码基于信息熵的概念,信息熵是用来度量信息量的一个指标。
当一个符号出现的概率越高时,其信息量越低,所需编码的位数也越少。
熵编码就是根据符号的概率分布,将频率较高的符号用较少的位数进行编码,从而减小数据的表示长度。
接下来,我们可以了解一下常用的熵编码算法,如霍夫曼编码和算术编码。
这两种算法都是通过建立符号和编码之间的对应关系来实现熵编码。
在实际使用中,我们可以先进行图像预处理,将图像进行离散化处理,将连续的像素值转化为离散的符号。
然后,利用统计方法来获取符号的概率分布。
对于图像中的颜色编码,我们可以统计每种颜色的出现次数,并计算其概率。
对于像素值编码,我们可以统计不同像素值的频率,并计算其概率。
接下来,我们需要根据符号的概率分布来构建编码表。
对于霍夫曼编码,我们可以根据符号的概率构建一颗霍夫曼树,将概率较高的符号放在树的较低层,概率较低的符号放在树的较高层。
然后,我们可以从树的根节点开始遍历树,根据左子树和右子树的关系为符号赋予相应的编码。
而对于算术编码,我们可以使用算术编码表来对符号进行编码。
编码完成后,我们将编码后的信息进行传输或存储。
在传输或存储过程中,我们需要注意将编码后的信息进行解码,以使接收方能够正确地解析图像数据。
为了正确地解码信息,接收方需要了解和发送方相同的编码表。
总结一下,图形图像编码中的熵编码算法是一种常用的数据压缩技术。
通过统计符号的概率分布,构建编码表,对数据进行编码,可以实现数据的压缩和传输效率的提高。
信息熵与图像熵的计算
实验一信息熵与图像熵计算一、实验目的1.复习MATL AB 的基本命令,熟悉MATL AB 下的基本函数。
2.复习信息熵基本定义, 能够自学图像熵定义和基本概念。
二、实验仪器、设备1.计算机-系统最低配置256M 内存、P4 CPU。
2.Matlab仿真软件- 7.0 / 7.1 / 2006a等版本Mat lab 软件。
三、实验内容与原理(1)内容:1.能够写出MATLAB源代码,求信源的信息熵。
2.根据图像熵基本知识,综合设计出M ATLAB程序,求出给定图像的图像熵。
(2)原理1. MATLAB中数据类型、矩阵运算、图像文件输入与输出知识复习。
2.利用信息论中信息熵概念,求出任意一个离散信源的熵(平均自信息量)。
自信息是一个随机变量,它是指某一信源发出某一消息所含有的信息量。
所发出的消息不同,它们所含有的信息量也就不同。
任何一个消息的自信息量都代表不了信源所包含的平均自信息量。
不能作为整个信源的信息测度,因此定义自信息量的数学期望为信源的平均自信息量:信息熵的意义:信源的信息熵H是从整个信源的统计特性来考虑的。
它是从平均意义上来表征信源的总体特性的。
对于某特定的信源,其信息熵只有一个。
不同的信源因统计特性不同,其熵也不同。
3.学习图像熵基本概念,能够求出图像一维熵和二维熵。
图像熵是一种特征的统计形式,它反映了图像中平均信息量的多少。
图像的一维熵表示图像中灰度分布的聚集特征所包含的信息量,令Pi 表示图像中灰度值为i的像素所占的比例,则定义灰度图像的一元灰度熵为:255log i iip p ==∑H图像的一维熵可以表示图像灰度分布的聚集特征,却不能反映图像灰度分布的空间特征,为了表征这种空间特征,可以在一维熵的基础上引入能够反映灰度分布空间特征的特征量来组成图像的二维熵。
用MATLAB统计图像直方图
3
直方图均衡化能够改善图像的对比度,突出细节, 使图像更加清晰。
Matlab实现直方图均衡化
01
在Matlab中,可以使用内置的`histeq`函数实现直方
图均衡化。
02
调用`histeq`函数时,需要将原始图像作为输入,并
返回均衡化后的图像。
03
Matlab还提供了其他函数和工具箱,如`imhist`和
5. 分析直方图
根据直方图的形状和分布情况, 可以对图像的亮度、对比度和分 布情况进行分析和评估。
03
图像直方图的计算
灰度图像直方图
灰度直方图
用于描述灰度图像中像素值的分 布情况,通过统计每个灰度级像 素的数量,可以反映图像的亮度 和对比度。
计算方法
遍历图像中的每个像素,统计每 个灰度级出现的次数,最终形成 灰度直方图。
直方图统计步骤
2. 转换为灰度图像
如果需要统计灰度图像的直方图, 可以使用rgb2gray函数将彩色图 像转换为灰度图像。
3. 统计像素值
使用imhist函数统计每个像素值 范围内的像素数量,生成直方图 数据。
1. 读取图像
使用imread函数读取图像文件。
4. 显示直方图
使用bar函数显示直方图。
VS
归一化方法
将直方图的值除以最大值,使其范围在01之间,便于比较不同图像的直方图特征 。
04
直方图均衡化
直方图均衡化的基本原理
1
直方图均衡化通过拉伸图像的灰度直方图,使其 充满整个灰度级别范围,从而提高图像的对比度。
2
通过计算原始图像的直方图,找到累积分布函数 (CDF),然后使用CDF对原始图像进行灰度映 射,实现直方图均衡化。
计算图像信息熵报告
计算图像信息熵报告1. 简介图像信息熵是一种用来描述图像中信息量的指标,它可以反映图像的复杂程度和信息丰富度。
本报告将介绍计算图像信息熵的步骤和方法。
2. 图像信息熵的定义图像信息熵是指图像中每个像素点的信息量的平均值。
信息量的计算可以通过像素的灰度值来实现。
在灰度图像中,每个像素的灰度值通常是一个从0到255的整数,代表了图像中的亮度。
3. 计算图像信息熵的步骤计算图像信息熵的步骤如下:步骤一:将图像转换为灰度图像在计算图像信息熵之前,首先需要将彩色图像转换为灰度图像。
这是因为彩色图像包含了RGB三个通道的信息,而计算信息熵只需要考虑灰度值。
步骤二:计算每个像素的灰度值频率对于灰度图像中的每个像素点,计算其灰度值出现的频率。
频率可以通过统计每个灰度值在图像中出现的次数来得到。
步骤三:计算每个像素的信息量利用每个像素的灰度值频率,计算每个像素的信息量。
信息量可以通过以下公式计算:信息量 = -频率 * log(频率)步骤四:计算图像信息熵将每个像素的信息量相加,然后取平均值,即可得到图像的信息熵。
信息熵的计算公式如下:信息熵 = 平均信息量 = 总信息量 / 像素数量4. 示例代码以下是使用Python编程语言实现计算图像信息熵的示例代码:import cv2import numpy as npimport mathdef calculate_entropy(image):gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)height, width = gray_image.shapepixel_count = height * width# 计算灰度值频率gray_level_counts = np.bincount(gray_image.flatten(), minlength=256) gray_level_probabilities = gray_level_counts / pixel_count # 计算信息量entropy =0for p in gray_level_probabilities:if p >0:entropy -= p * math.log2(p)return entropy# 读取图像image = cv2.imread("example.jpg")# 计算图像信息熵entropy = calculate_entropy(image)print("图像信息熵为:", entropy)5. 结论本报告介绍了计算图像信息熵的步骤和方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字图像处理实验报告——图像常用格式及显示武汉大学2016.041 实验内容本实验报告主要介绍主要内容1. 理解灰度映射原理;2. 掌握灰度映射计算方法;3. 理解图像直方图的定义;4. 理解图像直方图的作用;5. 理解图像熵的定义及作用;6. 掌握图像直方图计算方法;7. 掌握图像熵的计算方法;8. 进一步熟悉图像文件256色、24位真彩色BMP图像格式;9. 进一步熟悉Visual C++ 6.0编程界面,及使用方法;10. 熟悉Visual C++中绘图函数方法;11. 编程完成计算图像几种灰度映射;12. 编程实现计算图像直方图、图像熵;13. 编程绘制图像直方图;14. 根据不通灰度映射处理观察图像直方图变化;15. 总结实验过程(实验报告):编程、调试、结果、分析、结论。
主要目的1. 建立相关实验环境:从指定服务器指定位置拷贝实验相关材料,包括:实验要求,实例程序,示例图像,VC++6.0程序,实验相关幻灯片;2. 使用实验一建立的简单多文档应用程序框架及、图像夺取和显示功能,进一步熟悉图像的格式及显示,熟悉图像的组织和存储方式。
3. 编写图像线性灰度映射:4. 编写图像直方图统计程序:5. 观察图像直方图主要函数说明1.void CZhangyanImageView::OnProcessZhifangtu()函数目的:在用户界面中添加直方图处理,并添加函数在.cpp文件中函数参数说明:建立直方图处理函数2.void CZhangyanImageView::OnProcessLinetran()函数目的:在用户界面中添加灰度变换处理,并添加函数在.cpp文件中函数参数说明:建立灰度变换处理函数主要代码注释1.灰度变换函数代码CZhangyanImageDoc* pDoc = GetDocument();//定义引用doc的指针ASSERT_V ALID(pDoc);unsigned char * pBits=pDoc->m_pBits;//把文件中的m_pBits赋予pBitsint nWidth=pDoc->imageWidth;int nHeight=pDoc->imageHeight;//定义整形的image图片宽和高int nValue=0;double dValue=0.0;long lTotal=0;long lTotalD=0;long lTotalL=0;int ab=100,bb=255,a=0,b=255;//定义原图像的灰度值0-255范围,定义处理后图像灰度值100-255范围if(pBits==NULL) return ;//遍历完成则返回for(int i=0;i<nHeight;i++){lTotalL=nWidth*i;//统计出宽*当前高for(int j=0;j<nWidth;j++){lTotalD=lTotalL+j;//统计出第几个像素nValue=*(pBits+lTotalD);// 采用int nValue= *(m_pBits imageWidth * i+j )公式获得图像点灰度值dValue=ab+1.0*(bb-ab)/(b-a)*(nValue-a);//套用灰度变换公式pBits[lTotalD]=int(dValue);}}//对图像进行遍历与灰度处理Invalidate();//强制显示改变了的图像2.直方图生成函数m_bShow=TRUE;CZhangyanImageDoc* pDoc = GetDocument();//定义引用doc的指针ASSERT_V ALID(pDoc);unsigned char * pBits=pDoc->m_pBits; //把文件中的m_pBits图像指针赋予pBitsint nWidth=pDoc->imageWidth;int nHeight=pDoc->imageHeight; //定义整形的image图片宽和高int nValue=0;long lTotal=0;long lTotalD=0;long lTotalL=0;dMax=0;dMaxG=0;dMaxB=0;//数据初始化赋值存储图像灰度像素的计数if(pBits==NULL) return ;if(pDoc->m_nColorBits==8) //对图像进行是否是8彩色的判断{for(int k=0;k<256;k++){m_lValue[k]=0;m_dValue[k]=0.0;}for(int i=0;i<nHeight;i++){lTotalL=nWidth*i;for(int j=0;j<nWidth;j++){lTotalD=lTotalL+j;nValue=*(pBits+lTotalD);//统计灰度值m_lValue[nValue]=m_lValue[nValue]+1;//加1 }}lTotal=nWidth*nHeight;for(INT k=0;k<256;k++){m_dValue[k]=1.0*m_lValue[k]/lTotal;if(dMax<m_dValue[k]) dMax=m_dValue[k];}}//对图像进行遍历并统计直方图数据long nValueG=0;long nValueB=0;//统计R G Bif(pDoc->m_nColorBits==24) //对图像进行是否是24彩色的判断{for(int k=0;k<256;k++){m_lValue[k]=0;m_dValue[k]=0.0;m_lValueG[k]=0;m_dValueG[k]=0.0;m_lValueB[k]=0;m_dValueB[k]=0.0;//}for(int i=0;i<nHeight;i++){lTotalL=nWidth*i;for(int j=0;j<nWidth;j++){lTotalD=(lTotalL+j)*3;nValue=*(pBits+lTotalD);m_lValue[nValue]=m_lValue[nValue]+1;nValueG=*(pBits+lTotalD+1);m_lValueG[nValueG]=m_lValueG[nValueG]+1;nValueB=*(pBits+lTotalD+2);m_lValueB[nValueB]=m_lValueB[nValueB]+1;}}lTotal=nWidth*nHeight;for(int k=0;k<256;k++){m_dValue[k]=1.0*m_lValue[k]/lTotal;if(dMax<m_dValue[k]) dMax=m_dValue[k];m_dValueG[k]=1.0*m_lValueG[k]/lTotal;if(dMaxG<m_dValueG[k]) dMaxG=m_dValueG[k];m_dValueB[k]=1.0*m_lValueB[k]/lTotal;if(dMaxB<m_dValueB[k]) dMaxB=m_dValueB[k];}}//对图像进行遍历并统计直方图数据Invalidate();/强制显示改变了的图像3.变量声明void DrawGraph(CDC * pDC);//绘制直方图函数long m_lValue[256];//红色分量灰度统计double m_dValue[256];// 红色分量灰度频数long m_lValueG[256]; //绿色分量灰度统计double m_dValueG[256]; // 绿色分量灰度频数long m_lValueB[256]; //蓝色分量灰度统计double m_dValueB[256]; //蓝色分量灰度频数double dMax,dMaxG,dMaxB;//红、绿、蓝频数最大值BOOL m_bShow;//是否显示直方图4.图形绘制CZhangyanImageDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// CCCJImageDoc* pDoc 在各人的程序中不一样unsigned char * pBits=pDoc->m_pBits;int X0=0+5;int Y0=510;int WX=768+3,HY=500;int H=375;int W=256;CPen cyPen(PS_SOLID,2,RGB(255,255,0));CPen * oldPen=pDC->SelectObject(&cyPen);pDC->MoveTo(X0,Y0);pDC->LineTo(X0+WX,Y0);pDC->MoveTo(X0,Y0);pDC->LineTo(X0,Y0-HY);pDC->MoveTo(X0,Y0-HY);pDC->LineTo(X0+WX,Y0-HY);pDC->MoveTo(X0+WX,Y0);pDC->LineTo(X0+WX,Y0-HY);pDC->SelectObject(&oldPen);//设置直方图的区域{CPen redPen(PS_SOLID,1,RGB(255,0,0));oldPen=pDC->SelectObject(&redPen);for(int i=0;i<256;i++){int x0,y0,x1,y1;double dy;x0=X0+i*3;y0=Y0;x1=X0+i*3;dy=Y0-1.0*H*m_dValue[i]/dMax;y1=int(dy+0.5);pDC->MoveTo(x0,y0);pDC->LineTo(x1,y1); //进行绘图操作}pDC->SelectObject(oldPen);//以下略去对于24位的解释1.1灰度变换结果图灰度变换结果1.2图像直方图图读取图像直方图2实验日志2.1实验中遇到问题较于上次试验,本次试验显得轻车熟路许多,内容与调试也比较简单,感觉编写实验报告中遇到的最大困难就是对代码的阐述。
C++中指针是比较难的,再加上vs开发中结构架构的重叠,各种的声明,比较复杂,仔细的阅读了懂得了int nValue= *(m_pBits imageWidth * i +j )代表了灰度值的获取,再结合灰度变换的公式,就很快清楚了进行灰度变换函数的意思,对于直方图数据采集中出现的很多变量感觉不好理解,对于DrawGraph函数绘制的理解还是比较弱的,希望下次实验时让学长来解疑答惑,总之,这次试验按部就班的成功完成,要尽力完善一下自己对c++的理解,获益匪浅。