2019-07-08 15:38:02 Osean_li 阅读数 145
  • Matplotlib 数据分析可视化

    数据分析三剑客,NumPy、Pandas、Matplotlib,本课程是对Matplotlib的讲解,Matplotlib可以是分析的数据可视化,可以更直观的查看数据分析的结果,本课程独辟蹊径,不光教大家如何绘图,例如:饼图、柱状图、条形图、直方图等,而且深入剖析的Matplotlib的绘图原理,例如:如何操作图片,如何加载本地数据等。

    15305 人正在学习 去看看 郭宏志

引言

直方图广泛运用于很多计算机视觉运用当中。
参考整理的很好

什么是图像直方图?

通过标记帧与帧之间显著的边缘和颜色的统计变化,来检测视频中场景的变化。在每个兴趣点设置一个有相近特征的直方图所构成 “标签”,用以确定图像中的兴趣点。边缘,色彩,角度等直方图构成了可以被传递给目标识别分类器的一个通用特征类型

直方图就是数据进行统计的一种方法

  • 且具有图像平移、旋转、缩放不变性等众多优点。直方图在进行图像计算处理时代价较小,所以经常用于图像处理!
  • 直方图是一种对数据分布情况的图形表示,是一种二位统计图表,它的两个坐标分别是统计样本和该样本对应的某个属性的度量
  • 直方图是图像中像素强度分布的图形表达式
  • 它统计了每一个强度值所具有的像素个数

如何读懂直方图?

直方图的显示方式是左暗又亮,左边用于描述图像的暗度,右边用于描述图像的亮度
在这里插入图片描述

2019-03-07 20:49:59 qq_41671751 阅读数 623
  • Matplotlib 数据分析可视化

    数据分析三剑客,NumPy、Pandas、Matplotlib,本课程是对Matplotlib的讲解,Matplotlib可以是分析的数据可视化,可以更直观的查看数据分析的结果,本课程独辟蹊径,不光教大家如何绘图,例如:饼图、柱状图、条形图、直方图等,而且深入剖析的Matplotlib的绘图原理,例如:如何操作图片,如何加载本地数据等。

    15305 人正在学习 去看看 郭宏志

打开pycharm
我们可以先将实验中所需要的库安装好:
在这里插入图片描述
打开点击files中的settings
在这里插入图片描述
跳出一个弹窗后,选中project interpreter,接着点击界面右边的加号。
在这里插入图片描述
在搜索框中输入要添加的库名,随后点击install package开始安装库。
将前置条件准备好之后
创建新的.py文件
开始进行实验

1,.图像轮廓和直方图
图像轮廓线和图线等高线。在画图像轮廓前需要转换为灰度图像,因为轮廓需要获取每个坐标[x,y]位置的像素值。下面是画图像轮廓和直方图的代码:
在这里插入图片描述
运行上诉代码,可以得到如下图的结果:
在这里插入图片描述
2.高斯滤波
高斯模糊可以用于定义图像尺度、计算兴趣点以及很多其他的应用场合。
下面是对图像进行模糊显示的代码:
在这里插入图片描述
运行上诉代码,可以得到如下图的结果:
在这里插入图片描述
上面第一幅图为待模糊图像,第二幅用高斯标准差为2进行模糊,第三幅用高斯标准差为5进行模糊,最后一幅用高斯标准差为10进行模糊。

3.直方图均衡化
一个极其有用的例子是灰度变换后进行直方图均衡化。图像均衡化作为预处理操作,在归一化图像强度时是一个很好的方式,并且通过直方图均衡化可以增加图像对比度。下面是对图像直方图进行均衡化处理的例子:
在这里插入图片描述
运行上面代码,可以得到下述结果:
在这里插入图片描述

2018-11-03 16:53:39 weixin_40825989 阅读数 1629
  • Matplotlib 数据分析可视化

    数据分析三剑客,NumPy、Pandas、Matplotlib,本课程是对Matplotlib的讲解,Matplotlib可以是分析的数据可视化,可以更直观的查看数据分析的结果,本课程独辟蹊径,不光教大家如何绘图,例如:饼图、柱状图、条形图、直方图等,而且深入剖析的Matplotlib的绘图原理,例如:如何操作图片,如何加载本地数据等。

    15305 人正在学习 去看看 郭宏志

计算一幅图像的直方图

图像是由不同数值的颜色像素组成,像素值在整幅图像中的分布情况是该图像的一个重要属性。直方图(Histogram)是一幅图像分布的精确图形表示。因此,灰度图像的直方图有256个项目。

OpenCV计算直方图

  • 环境:Windows 10, Microsoft Visual Studio 2015

Histogram1D类的创建

OpenCV可以简单地调用 cv:calcHist 函数来进行直方图计算,我们创建一个专用类来处理单通道灰度图像的类。

class Histogram1D {

private:

	int histSize[1];
	float hranges[2];
	const float* ranges[1];
	int channels[1];

public:

	Histogram1D() {
		histSize[0] = 256;
		hranges[0] = 0.0;
		hranges[1] = 256.0;
		ranges[0] = hranges;
		channels[0] = 0;
	}

	Mat getHistogram(const Mat &image) {
		Mat hist;
		calcHist(&image, 1, channels, Mat(), hist, 1, histSize, ranges);
		return hist;
	}

	Mat getHistogramImage(const Mat &image, int zoom = 1) {
		Mat hist = getHistogram(image);
		return getImageOfHistogram(hist, zoom);
	}

	static Mat getImageOfHistogram(const Mat &hist, int zoom) {
		double maxVal = 0;
		double minVal = 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 = static_cast<int>(binVal*hpt / maxVal);
				line(histImg, Point(h*zoom, histSize*zoom),
					Point(h*zoom, (histSize - intensity)*zoom), Scalar(0), zoom);
			}
		}
		return histImg;
	}
};

图像直方图计算

所使用的图片如下所示:

主函数编辑:

int main()
{
	Mat image = imread("Fig3.15(a)1top.BMP", 0);
	Histogram1D h;
	Mat histo = h.getHistogram(image);
	for (int i = 0; i < 256; i++)
	{
		cout << "Value " << i << " = " << histo.at<float>(i) << endl;
	}
	namedWindow("Histogram");
	imshow("Histogram", h.getHistogramImage(image));
	waitKey(0);
	return 0;
}

输出的值非0的结果:

Value 12 = 477
Value 13 = 16986
Value 14 = 379
Value 15 = 572
Value 16 = 1917
Value 17 = 8955
Value 18 = 2129
Value 19 = 16228
Value 20 = 10188
Value 21 = 3327
Value 22 = 5751
Value 23 = 1406
Value 24 = 4224
Value 25 = 1266
Value 26 = 4332
Value 27 = 2539
Value 28 = 2830
Value 29 = 5529
Value 30 = 2141
Value 31 = 3653
Value 32 = 2187
Value 33 = 4142
Value 34 = 3227
Value 35 = 5808
Value 36 = 3019
Value 37 = 4913
Value 38 = 6980
Value 39 = 4303
Value 40 = 3729
Value 41 = 4048
Value 42 = 6398
Value 43 = 1849
Value 44 = 6581
Value 45 = 1762
Value 46 = 6731
Value 47 = 9532
Value 48 = 3374
Value 49 = 5324
Value 50 = 2989
Value 51 = 4945
Value 52 = 3840
Value 53 = 3528
Value 54 = 3609
Value 55 = 5614
Value 56 = 5712
Value 57 = 1385
Value 58 = 4312
Value 59 = 2731
Value 60 = 3788
Value 61 = 1018
Value 62 = 3184
Value 63 = 863
Value 64 = 1910
Value 65 = 3471
Value 66 = 2638
Value 67 = 697
Value 68 = 2341
Value 69 = 1434
Value 70 = 1339
Value 71 = 1378
Value 72 = 1744
Value 73 = 971
Value 74 = 2267
Value 75 = 1460
Value 76 = 861
Value 77 = 909
Value 78 = 158
Value 79 = 141
Value 80 = 16
Value 81 = 9
Value 82 = 1
Value 83 = 1

直方图显示如下:

OpenCV直方图均衡

OpenCV提供了一个直方图均衡化的函数 cv::equalizeHist(image,result),我们通过使用这个函数来实现直方图均衡化,通过修改下面main函数:

int main()
{
	Mat image = imread("Fig3.15(a)1top.BMP", 0);
	Histogram1D h;
	Mat histo = h.getHistogram(image);
	for (int i = 0; i < 256; i++)
	{
		if (histo.at<float>(i) != 0) 
			cout << "Value " << i << " = " << histo.at<float>(i) << endl;
	}
	namedWindow("Histogram");
	imshow("Histogram", h.getHistogramImage(image));
	/*namedWindow("Cell");
	imshow("Cell", image);
	equalizeHist(image, image);
	namedWindow("CellequalizeHist");
	imshow("CellequalizeHist", image);
	namedWindow("Histogram2");
	imshow("Histogram2", h.getHistogramImage(image));*/
	waitKey(0);
	return 0;
}

最终效果如下:


在这里插入图片描述

在这里插入图片描述

2019-06-20 00:36:25 qq_35306281 阅读数 669
  • Matplotlib 数据分析可视化

    数据分析三剑客,NumPy、Pandas、Matplotlib,本课程是对Matplotlib的讲解,Matplotlib可以是分析的数据可视化,可以更直观的查看数据分析的结果,本课程独辟蹊径,不光教大家如何绘图,例如:饼图、柱状图、条形图、直方图等,而且深入剖析的Matplotlib的绘图原理,例如:如何操作图片,如何加载本地数据等。

    15305 人正在学习 去看看 郭宏志

读图像、显示图像采用opencv接口,算法主体用python编写
算法步骤在代码中详细体现。
代码如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

'直方图均衡化函数,0::28 2019/06/20'

__author__ = 'mint'

import numpy as np
import cv2 as cv

#创建空列表(数组)
def createEmptyList(size):
    newList = []
    for eachNum in range(0, size):
        newList.append(0)
    return newList

#创建空图像矩阵
def createEmptyImage(rows, cols,type):
    img = np.zeros((rows, cols), dtype=type)
    return img

#直方图均衡化
def histequaLize(src, dst):

    #step 1 校验参数#
    assert(type(src)==np.ndarray)
    assert(src.dtype == np.uint8)
    assert (type(dst) == np.ndarray)
    assert (dst.dtype == np.uint8)

    # step 2 直方图统计#
    hist = createEmptyList(256)
    rows, cols = src.shape
    for r in range(rows):
        for c in range(cols):
            hist[src[r,c]] += 1

    # step 3 直方图归一化#
    for each in range(256):
        hist[each] /= rows*cols
        
    # step 4 直方图累加#
    for each in range(1,256):
        hist[each] = hist[each-1] + hist[each]

    # step 4 均衡#
    for each in range(256):
        hist[each] = (np.uint8)(255*hist[each] + 0.5)

    for r in range(rows):
        for c in range(cols):
            dst[r,c] = hist[src[r,c]]

def histMain():
    img = cv.imread('lena.jpg')
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    dst = createEmptyImage(img.shape[0], img.shape[1], np.uint8)
    histequaLize(gray, dst)
    cv.imshow('histEnhance.jpg', dst)
    cv.waitKey(0)

if __name__ == '__main__':
    histMain()

输出如下:
在这里插入图片描述

2017-09-08 15:18:03 wl1070325332 阅读数 349
  • Matplotlib 数据分析可视化

    数据分析三剑客,NumPy、Pandas、Matplotlib,本课程是对Matplotlib的讲解,Matplotlib可以是分析的数据可视化,可以更直观的查看数据分析的结果,本课程独辟蹊径,不光教大家如何绘图,例如:饼图、柱状图、条形图、直方图等,而且深入剖析的Matplotlib的绘图原理,例如:如何操作图片,如何加载本地数据等。

    15305 人正在学习 去看看 郭宏志
//直方图均衡
Mat HistogramEquilibrium(Mat src)
{
	int num = 1;
	//首先创建一个存储像素灰度值以及灰度值出现次数的键值对
	map<int,int> pixelStatistic;
	//遍历图像像素,统计各灰度值出现次数
	for(int r = 0;r < src.rows;r++)
	{
		uchar* srcRowData = src.ptr<uchar>(r);
		for(int c = 0;c < src.cols;c++)
		{
			map<int,int>::iterator it = pixelStatistic.find(srcRowData[c]); 
			if(it != pixelStatistic.end())
			{
				it->second++;
			}
			else
			{
				pixelStatistic.insert(pair<int, int>(srcRowData[c], num));
			}
		}
	}
	//创建灰度值及其出现概率的键值对
	map<int, double> probability;
	int sum = 0;
	//计算各灰度值在直方图均衡过程中的映射关系(等于从0灰度值开始,各灰度值的概率向下求和)
	for(int i = 0;i <= 255;i++)
	{
		map<int, int>::iterator it = pixelStatistic.find(i);
		sum += it->second;
		probability.insert(pair<int, double>(i, sum * 1.0 / (src.rows * src.cols)));
	}
	Mat dst;
	dst.create(src.size(), src.type());
	//将各灰度值映射到相应的灰度级中,得到均衡后的灰度值
	for(int r = 0;r < src.rows;r++)
	{
		uchar* srcRowData = src.ptr<uchar>(r);
		uchar* dstRowData = dst.ptr<uchar>(r);
		for(int c = 0;c < src.cols;c++)
		{
			map<int, double>::iterator it = probability.find(srcRowData[c]);
			dstRowData[c] = (uchar)(it->second * 255);
		}
	}
	return dst;
}

OPENCV直方图均衡化

阅读数 253

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