2016-07-11 15:56:22 chengkangchengkang 阅读数 1076
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    19972 人正在学习 去看看 夏曹俊
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/opencv.hpp>
#include"iostream"


using namespace std;
using namespace cv;
class Histogram1D
{
private:
int histSize[1];//the number of 
float hranges[2];//the maximum and min of the pixel
const float*ranges[1];
int channels[1];//only use one channel
public:
Histogram1D(){
// the parementer of the 1D histogram
histSize[0]=256;
hranges[0]=0.0;
hranges[1]=255.0;
ranges[0]=hranges;
channels[0]=0;//the normal
}
//calculate the distribution of the 1d
cv::MatND getHistogram(const cv::Mat &image)
{
cv::MatND hist;
//calculate the histogram
cv::calcHist(&image,
1,//calculate the single image's histogram
channels,//the number of channels
cv::Mat(),// not use the image as mask;
hist,//return hist
1,//one-di
histSize,//the number of 
ranges//the range of pixel
);
return hist;
}
cv::Mat getHistogramImage(const cv::Mat &image)
{
//first ,calculate the histogram
cv::MatND hist = getHistogram(image);
//receive the max and min number
double maxVal = 0;
double minVal = 0;
cv::minMaxLoc(hist,&minVal,&maxVal,0,0);
//imshow the image of histogram
cv::Mat histImg(histSize[0],histSize[0],
CV_8U,cv::Scalar(255));
//set up the highest point is the 90 precent of the nbins
int hpt = static_cast<int>(0.9*histSize[0]);
// every level,draw a vertical line
for (int h =0;h<histSize[0];h++)
{
float binVal = hist.at<float>(h);
int intensity = static_cast<int>(binVal*hpt/maxVal);
//draw a line with two point
cv::line(histImg,cv::Point(h,histSize[0]),
cv::Point(h,histSize[0]-intensity),
cv::Scalar::all(0));
}
return histImg;
}
};
int main()
{
cv::Mat image = cv::imread("D:\\ben3.jpg");
// the histogram 
Histogram1D h;
//calculate hist
cv::MatND histo=h.getHistogram(image);
//scan the every level
for(int i=0;i<256;i++)
cout<<"Value"<<i<<"="<<
histo.at<float>(i)<<endl;
cv::namedWindow("Histogram");
cv::imshow("Histogram",
h.getHistogramImage(image));
cv::Mat thresholded;
cv::threshold(image,thresholded,80,255,cv::THRESH_BINARY);
cv::namedWindow("binary image");
cv::imshow("binary image",thresholded);
cv::waitKey(0);
system("pause");
return 0;
}
2019-04-05 10:01:38 AlonewaitingNew 阅读数 1260
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    19972 人正在学习 去看看 夏曹俊

灰度直方图原理

灰度直方图的含义是一张灰度图上各个灰度值所占的频率大小,并将其以直方图的形式展现。下面给出一个例子,灰度值定义在0-7之间的数值。
在这里插入图片描述
假设各个像素点的灰度值如上图所示,则可以统计出各个灰度值所占的频率如下:
在这里插入图片描述
根据各个灰度占的频率可以将其以直方图的形式绘制如下:
在这里插入图片描述
可以很直观的观察到各个灰度值所占的比率。而灰度直方图在灰度图像处理方面有比较多的应用。例如
1.可以为阈值分割提供一定的依据。
2.灰度直方图均值化提高灰度图像的对比度
3.反向投影直方图检测特定图像的内容
4.均值平移算法可以检测目标的移动
5.灰度直方图的对比,可以寻找相似图片,为图片分类,提供一定的依据
在此我们首先介绍灰度直方图的获取,以及阈值分割处理结果

灰度直方图实现

本文依赖的库为开源OpenCV4.0,以下为C++实现代码,代码中有注释,主要通过创建一个类实现整个过程

#pragma once
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
using namespace cv;
int menu();
class Histogram1D {
private:
	int histSize[1];//定义灰度直方图中类型的数目
	float hrange[2];//定义灰度直方图值的范围
	const float * ranges[1];//定义一个指针数组
	int channels[1];//定义检查的通道数
public:
	Histogram1D() {
		histSize[0] = 256;
		hrange[0] = 0;
		hrange[1] = 256;
		ranges[0] = hrange;
		channels[0] = 0;
	}
	//获取灰度直方图各个类型的频率
	Mat getHistogram(const Mat &image) {
		Mat hist;
		calcHist(&image,1,channels,Mat(),hist,1,histSize,ranges);
		return hist;
	}
	//画图函数
	static Mat getImageOfHistogram(const Mat &hist, int zoom)
	{
		double maxval = 0.0;
		double minval = 0.0;
		minMaxLoc(hist, &minval, &maxval, 0, 0);
		int histSize = hist.rows;
		Mat histImg(histSize*zoom, histSize*zoom, CV_8U, Scalar(255));
		int hpt = static_cast<int>(0.9*histSize);
		for (int h = 0;h < histSize;h++)
		{
			float binVal = hist.at<float>(h);
			if (binVal > 0)
			{
				int intensity = (int)(binVal*hpt / maxval);
				line(histImg, Point(h*zoom, histSize*zoom), Point(h*zoom, (histSize - intensity)*zoom), Scalar(0), zoom);
			}
		}
		return histImg;
	}
	Mat getHistogramImage(const Mat &image, int zoom = 1)
	{
		Mat hist = getHistogram(image);
		return getImageOfHistogram(hist, zoom);
	}
};
int menu()
{
	Mat image1 = imread("01.jpg", -1);
	imshow("nomal", image1);
	Mat image = imread("01.jpg", 0);
	imshow("gray", image);
	Histogram1D h;
	Mat hist = h.getHistogram(image);


	//将二值图与图的形式展现
	Mat img = h.getHistogramImage(image);

	//寻找占比例最大的灰度
	int index = 0;
	float flag = hist.at<float>(0);
	for (int i = 0;i < 256;i++)
	{	
		if (hist.at<float>(i)>flag)
		{
			flag = hist.at<float>(i);
			index = i;
		}
		//cout << "value" << i << "=" << hist.at<float>(i) << endl;
	}
	cout << "the max value of the Histgram is:" << index << endl;

	namedWindow("Histgram", WINDOW_AUTOSIZE);
	imshow("Histgram", img);

	Mat thresh;
	threshold(image, thresh, index, 255, THRESH_BINARY);
	namedWindow("thresh", WINDOW_AUTOSIZE);
	imshow("thresh", thresh);

	waitKey(0);
	//cout << "hello world" << endl;
	return 0;
}
int main()
{
	menu();
	system("pause");
	return 0;
}

以下为实现效果:
在这里插入图片描述这是根据直方图的分布而选的阈值做的阈值分割结果,可以看到该阈值能够较好的分割图像,图像的边缘基本能够找到,这为下一步图像的边缘提取,图像的形态学处理打下了基础。
下面是图像灰度直方图:
在这里插入图片描述
灰度值频率最高的大小为
在这里插入图片描述
如此便基本完成了灰度直方图的提取和分析。后面将会持续给出灰度直方图的其他方面应用。

小结

灰度直方图在灰度图像处理方面有比较多的应用。例如
1.可以为阈值分割提供一定的依据。
2.灰度直方图均值化提高灰度图像的对比度
3.反向投影直方图检测特定图像的内容
4.均值平移算法可以检测目标的移动
5.灰度直方图的对比,可以寻找相似图片,为图片分类,提供一定的依据

如有不对请多多指正,一起学习,一起进步

2014-07-02 22:58:29 u012771236 阅读数 2725
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    19972 人正在学习 去看看 夏曹俊

灰度直方图

是灰度级的函数,描述的是图像中该灰度级的像个数或该灰度级像素出现的频率(归一化)


  • 生成并绘制直方图:
src = imread('Fig0303(a)(breast).tif');
imshow(src);
h1 = imhist(src);                      %生成直方图
figure,imhist(src,255);             %绘制直方图

h2 = imhist(src, 25);                 %生成直方图
horz = linspace(0, 255, 25);
figure,bar(horz, h2);                 %绘制条状直方图
axis([0 255 0 60000]);               %设置坐标轴最大最小值
set(gca, 'xtick', 0:50:250);          %设置坐标轴的标尺
set(gca, 'ytick', 0:20000:60000);
xlabel('灰度级', 'fontsize', 10);  %坐标轴附加图像
ylabel('灰度值', 'fontsize', 10);
text(150, 40000, '条形直方图', 'fontsize',15);

h3 = imhist(src, 25);                 %生成直方图
horz = linspace(0, 255, 25);
figure,stem(horz, h3, 'fill');      %绘制杆状直方图
axis([0 255 0 60000]);               %设置坐标轴最大最小值
set(gca, 'xtick', 0:50:250);         %设置坐标轴的标尺
set(gca, 'ytick', 0:20000:60000);
xlabel('灰度级', 'fontsize', 10); %坐标轴附加图像
ylabel('灰度值', 'fontsize', 10);
text(150, 40000, '杆状直方图', 'fontsize',15);

h4 = imhist(src);                       %生成直方图
figure,plot(h4);                         %绘连续直方图
xlim('auto');                              %自动设置坐标轴范围和标尺
ylim('auto');
text(150, 40000, '连续直方图', 'fontsize',15);


 
  • 直方图均衡化(可使图像的灰度间距拉开或使灰度分布均匀):
src = imread('Fig0303(a)(breast).tif');
result = histeq(src);    %均衡化
imshow(result);






  • 自适应直方图均衡化:
src = imread('Fig0303(a)(breast).tif');
result = adapthisteq(src);%自适应直方图均衡化
figure, imshow(src);
figure, imhist(src);
figure, imshow(result);
figure, imhist(result);



  • MATLAB函数小结:
imhist( ):该函数用于获取图像数据直方图。(PS:若没有赋值给左边的变量,该函数将显示一张灰度直方图)
h1 = imhist( src, n )
src--输入图像
n   --灰度级别,默认为256

linspace(a, b, n):该函数生成一个(1xn)数组,数据的第一个元素值为a,最后一个元素为b,n是总采样点数。(PS:所有元素的值均匀分布)

bar(horz, h2):绘制条状直方图,通过horz控制直方图显示的密集程度                 
horz -- 一个(1xn)数组(跟h2同阶)
h2    -- 要绘制的直方图

stem(horz, h3, 'fill'):绘制杆状直方图
horz -- 一个(1xn)数组(跟h2同阶)
h2    -- 要绘制的直方图
'fill'  -- 杆头是否空心

plot(h4):绘连续直方图


result = histeq(src);    %获取直方图均衡化后的图像

result = adapthisteq(src);      %获取直方图自适应均衡化后的图像



2015-12-01 21:47:40 GarfieldEr007 阅读数 9595
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    19972 人正在学习 去看看 夏曹俊

第三章 灰度直方图

目录

1.    灰度直方图

2.    直方图均衡化

3.    直方图规范化

4.    色彩直方图

作业


1.灰度直方图

灰度直方图(histogram)是灰度级的函数,它表示图象中具有每种灰度级的象素的个数,反映图象中每种灰度出现的频率。如下图所示,灰度直方图的横坐标是灰度级,纵坐标是该灰度级出现的频率,是图象的最基本的统计特征。

  

 从概率的观点来理解,灰度出现的频率可看作其出现的概率,这样直方图就对应于概率密度函数pdf(probability density function),而概率分布函数就是直方图的累积和,即概率密度函数的积分,如下图所示:

 
 

 

若直接从代表每种灰度的象素数目的直方图来观察,常用如下的表示:

 
 

 

灰度直方图的计算是很简单的,依据定义,若图象具有L(通常L=256,即8位灰度级)级灰度,则大小为MxN的灰度图象f(x,y)的灰度直方图hist[0…L-1]可用如下计算获得:

1.    初始化 hist[k]=0 ; k=0,…,L-1

2.    统计 hist[f(x,y)]++ ; xy =0,…,M-1, 0,…,N-1

3.    标准化 hist[f(x,y)]/=M*N

2.直方图均衡化

 直方图均衡化是通过灰度变换将一幅图象转换为另一幅具有均衡直方图,即在每个灰度级上都具有相同的象素点数的过程。

设灰度变换 s=f(r) 为斜率有限的非减连续可微函数,它将输入图象A(x,y)转换为输出图象B(x,y),输入图象的直方图为HA(r),输出图象的直方图为HB(s),则它们的关系可由如下过程导出:

 
 

 


 

例如,下图是直方图均衡化后的飞机图片及其直方图,可见其直方图与原图的直方图相比是很均衡的,但必须说明的是,离散情况下不可能作到绝对的一致。

  

 

3.直方图规范化

直方图规范化是指将一幅图象通过灰度变换后,使其具有特定的直方图形式,如使图象与某一标准图象具有相同的直方图,或使图象具有某一特定函数形式的直方图。

如下图所示,希望将图象A(x,y)变换为具有特定直方图H3(D)的图象C(x,y)。首先利用直方图均衡化将图象A(x,y)变换为具有平坦直方图的图象B(x,y),再利用第二个灰度变换将B(x,y)变换为C(x,y):

 

 

 

 

 

 

 

 

 

 

 

 
 

 

4.色彩直方图

 色彩直方图是高维直方图的特例,它统计色彩的出现频率,即色彩的概率分布信息。通常这需要一定的量化过程,将色彩分成若干互不重叠的种类。一般不直接在RGB色彩空间中统计,而是在将亮度分离出来后,对代表色彩部分的信息进行统计,如在HSI空间的HS子空间、YUV空间的UV子空间,以及其它反映人类视觉特点的彩色空间表示中进行。例如,下图是统计肤色分布情况的例子。

 

(图片来源:Lv Fengjun, Ai Haizhou, et.al., Face Detection Based on Skin Color and Template Matching, ICIG'2000, Aug.16-18, 2000.)

作业

1.编制直方图均衡化及直方图规范化程序(输入输出图象格式bmp)。


返回主目录 返回本章目录

清华大学计算机系 艾海舟

最近修改时间:2000年1月10日


http://media.cs.tsinghua.edu.cn/~ahz/digitalimageprocess/chapter03/chapt03_ahz.htm

2019-10-14 16:53:07 qq_36343105 阅读数 37
  • 学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程

    OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频培训课程概况:教程中会讲解到基于opencv视频和摄像机录制、播放和播放进度控制,多视频图像合并、多视频图像融合、剪切、视频亮度、对比度、尺寸(近邻插值(手动实现),双线性插值,图像金字塔)、颜色格式(灰度图,二值化(阈值)),旋转镜像,视频裁剪(ROI),视频水印(ROI+weight),导出处理后的视频(包含音频,使用ffmpeg工具对音频进行抽取、剪切和终于opencv处理的视频合并)。

    19972 人正在学习 去看看 夏曹俊

  最近的《数字图像处理》课程要求绘制图像的灰度直方图。然而我发现网络上用QT实现的方法全都是基于外部库QCustomPlot,需要自己去下载源码比较麻烦。所以我决定用QT自带的QtCharts实现:

1.首先要配置.pro文件,加上:

    QT += charts

2.源码:

void ImageProcesser::showHistogram(QImage grayimage){
    //  对直方图进行数据处理,求出各个灰度值的像素数
    int data[256]{0};
    int yRange = 0;
    int width = grayimage.width();
    int height = grayimage.height();
    for(int i = 0; i <width; i++){
        for(int j = 0; j < height; j++){
            int index = grayimage.pixelIndex(i, j);
            ++data[index];
        }
    }

    //设置每个“柱”的颜色,值,宽度等
    QBarSet *set = new QBarSet("灰度值");
    for (int i=0;i<256;i++) {
       set->append(data[i]);
       if(yRange<data[i]) yRange = data[i];
       set->setColor(QColor::Rgb);
    }
    QBarSeries *series = new QBarSeries();
    series->append(set);
    series->setBarWidth(1.2);

    //设置横坐标
    QStringList categories;
    for(int i=0; i<256; i++)
        categories.push_back("");
    QBarCategoryAxis *axisX = new QBarCategoryAxis();
    axisX->append(categories);

    //设置纵坐标
    QValueAxis *axisY = new QValueAxis;
    axisY->setLabelFormat("%d");
    axisY->setRange(0,yRange);

    //建表
    QChart *chart = new QChart();
    chart->addSeries(series);
    chart->createDefaultAxes();
    chart->setAxisX(axisX);
    chart->setAxisY(axisY);
    chart->setTitle("灰度直方图");
    chart->setAnimationOptions(QChart::SeriesAnimations);
    chart->legend()->setVisible(false);

    //表的容器
    chartview->setChart(chart);
    chartview->setRenderHint(QPainter::Antialiasing);
    chartview->setVisible(true);
}

3.实现效果:
在这里插入图片描述

没有更多推荐了,返回首页