OPENCV创建图像直方图并显示
- 格式:doc
- 大小:29.00 KB
- 文档页数:2
图像直方图实验报告实验目的本实验旨在通过使用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. 结果分析通过观察直方图,可以分析图像的亮度特性和分布情况。
OpenCV图像处理技术介绍一、概述OpenCV(Open Source Computer Vision Library)是一款用于计算机视觉和机器视觉的开源跨平台库。
它被广泛应用于计算机视觉、图像处理、机器学习、人工智能等领域,是一种非常强大、开放的框架。
本文将重点介绍 OpenCV 图像处理技术,以帮助读者了解它的具体应用和实现过程。
二、图像的读取和展示要使用 OpenCV 进行图像处理,需要先加载图像。
OpenCV 支持多种图像格式,如 BMP、JPEG、PNG、GIF 等。
用OpenCV 加载图像的方法有两种:一种是cv::imread() 函数,另一种是 cv::VideoCapture 类。
cv::imread() 函数可以通过指定图像路径或网络 URL 加载本地或远程图像,读取后返回一个 cv::Mat 对象,然后可以使用cv::imshow() 函数将图像展示在屏幕上。
三、灰度化和二值化灰度化将一个彩色图像转换为黑白图像,使得图像的像素值只有一个亮度值,而没有颜色信息。
在 OpenCV 中,可以通过cv::cvtColor() 函数将一张彩色图像转换为灰度图像。
二值化是将灰度图像中的像素值转换为 0 或 255,即黑色或白色。
它主要用于将图像转换为二进制图像,方便进一步处理。
在OpenCV 中,可以使用 cv::threshold() 函数实现图像的二值化,可以设置操作的阈值、最大值和操作类型等参数。
四、图像滤波图像滤波是指对图像进行平滑或增强的处理方法。
在 OpenCV 中,可以使用 cv::GaussianBlur() 函数实现图像的高斯滤波,可以设置卷积核的大小和标准差等参数,以及边缘处理的方法。
此外,还可以使用 cv::medianBlur() 函数进行中值滤波,cv::bilateralFilter() 函数进行双边滤波,以及 cv::blur() 函数进行均值滤波等。
OpenCV基本使用方法一、介绍O p en CV是一个开源的计算机视觉库,提供了丰富的图像处理和计算机视觉算法,可以用于图像处理、目标检测、人脸识别等各种应用。
本文档将介绍O pe nC V的基本使用方法,包括图像读取、显示、保存以及常用的图像处理操作。
二、图像读取与显示1.读取图像要读取图像,可以使用`cv2.im re ad()`函数。
该函数接受图像文件的路径作为参数,并返回一个表示图像的多维数组。
i m po rt cv2i m ag e=cv2.im re ad("im ag e.jp g")2.显示图像要显示图像,可以使用`cv2.im sh ow()`函数。
该函数接受一个窗口名称和一个表示图像的多维数组作为参数。
i m po rt cv2i m ag e=cv2.im re ad("im ag e.jp g")c v2.im sh ow("Im age",i ma ge)c v2.wa it Ke y(0)c v2.de st ro yA ll Wind ow s()三、图像保存与格式转换1.保存图像要保存图像,可以使用`cv2.im wr it e()`函数。
该函数接受图像保存的路径和表示图像的多维数组作为参数。
i m po rt cv2i m ag e=cv2.im re ad("im ag e.jp g")c v2.im wr it e("n ew_i ma ge.j pg",im age)2.格式转换要将图像从一种格式转换为另一种格式,可以使用`c v2.c vt Co lo r()`函数。
该函数接受表示图像的多维数组和转换的标志作为参数。
i m po rt cv2i m ag e=cv2.im re ad("im ag e.jp g")g r ay_i ma ge=c v2.cv t Co lo r(im ag e,cv2.CO LO R_BG R2GR AY)四、常用的图像处理操作1.转换为灰度图要将彩色图像转换为灰度图,可以使用`c v2.cv tC ol or()`函数,并指定转换标志为`cv2.CO LO R_BG R2GR AY`。
4.OpenCV-Python——模版匹配、直⽅图⼀、模版匹配1、模版匹配 模板匹配和卷积原理很像,模板在原图像上从原点开始滑动,计算模板与(图像被模板覆盖的地⽅)的差别程度,这个差别程度的计算⽅法在opencv⾥有6种,然后将每次计算的结果放⼊⼀个矩阵⾥,作为结果输出。
假如原图形是AxB⼤⼩,⽽模板是axb⼤⼩,则输出结果的矩阵是(A-a+1)x(B-b+1)。
TM_SQDIFF:计算平⽅不同,计算出来的值越⼩,越相关TM_CCORR:计算相关性,计算出来的值越⼤,越相关TM_CCOEFF:计算相关系数,计算出来的值越⼤,越相关TM_SQDIFF_NORMED:计算归⼀化平⽅不同,计算出来的值越接近0,越相关TM_CCORR_NORMED:计算归⼀化相关性,计算出来的值越接近1,越相关TM_CCOEFF_NORMED:计算归⼀化相关系数,计算出来的值越接近1,越相关1# *******************模版匹配**********************开始2import cv23import numpy as np4import matplotlib.pyplot as plt56# 模板匹配7 img = cv2.imread('lena.jpg', 0)8 template = cv2.imread('face.jpg', 0)910 h, w = template.shape[:2]1112 methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR',13'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']1415# 匹配⽅法16 res = cv2.matchTemplate(img, template, cv2.TM_SQDIFF)17print(res.shape)18# 匹配结果返回19 min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)20print(min_val,max_val,min_loc,max_loc)2122# 6种不同⽅法⽐较23for meth in methods:24 img2 = img.copy()2526# 匹配⽅法的真值27 method = eval(meth)28print (method)29 res = cv2.matchTemplate(img, template, method)30 min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)3132# 如果是平⽅差匹配TM_SQDIFF或归⼀化平⽅差匹配TM_SQDIFF_NORMED,取最⼩值33if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:34 top_left = min_loc35else:36 top_left = max_loc37 bottom_right = (top_left[0] + w, top_left[1] + h)3839# 画矩形40 cv2.rectangle(img2, top_left, bottom_right, 255, 2)4142 plt.subplot(121), plt.imshow(res, cmap='gray')43 plt.xticks([]), plt.yticks([]) # 隐藏坐标轴44 plt.subplot(122), plt.imshow(img2, cmap='gray')45 plt.xticks([]), plt.yticks([])46 plt.suptitle(meth)47 plt.show()48# *******************模版匹配**********************结束六种⽅法的匹配结果:2、多个匹配1# *******************膜版匹配-多个匹配**********************开始2import cv23import numpy as np4import matplotlib.pyplot as plt56 img_rgb = cv2.imread('mario.jpg')7 img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)8 template = cv2.imread('mario_coin.jpg', 0)9 h, w = template.shape[:2]1011 res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)12 threshold = 0.813# 取匹配程度⼤于%80的坐标14 loc = np.where(res >= threshold)15for pt in zip(*loc[::-1]): # *号表⽰可选参数16 bottom_right = (pt[0] + w, pt[1] + h)17 cv2.rectangle(img_rgb, pt, bottom_right, (0, 0, 255), 2)1819 cv2.imshow('img_rgb', img_rgb)20 cv2.waitKey(0)21# *******************膜版匹配-多个匹配**********************结束⼆、直⽅图cv2.calcHist(images,channels,mask,histSize,ranges)images: 原图像图像格式为 uint8 或 float32。
图像处理基础(8):图像的灰度直⽅图、直⽅图均衡化、直⽅图规定化(匹配)本⽂主要介绍了灰度直⽅图相关的处理,包括以下⼏个⽅⾯的内容:利⽤OpenCV 计算图像的灰度直⽅图,并绘制直⽅图曲线直⽅图均衡化的原理及实现直⽅图规定化(匹配)的原理及实现图像的灰度直⽅图⼀幅图像由不同灰度值的像素组成,图像中灰度的分布情况是该图像的⼀个重要特征。
图像的灰度直⽅图就描述了图像中灰度分布情况,能够很直观的展⽰出图像中各个灰度级所占的多少。
图像的灰度直⽅图是灰度级的函数,描述的是图像中具有该灰度级的像素的个数:其中,横坐标是灰度级,纵坐标是该灰度级出现的频率。
不过通常会将纵坐标归⼀化到[0,1]区间内,也就是将灰度级出现的频率(像素个数)除以图像中像素的总数。
灰度直⽅图的计算公式如下:p (r k )=n kMN其中,r k 是像素的灰度级,n k 是具有灰度r k 的像素的个数,MN 是图像中总的像素个数。
OpenCV 灰度直⽅图的计算直⽅图的计算是很简单的,⽆⾮是遍历图像的像素,统计每个灰度级的个数。
在OpenCV 中封装了直⽅图的计算函数calcHist ,为了更为通⽤该函数的参数有些复杂,其声明如下:void calcHist( const Mat* images, int nimages,const int* channels, InputArray mask,OutputArray hist, int dims, const int* histSize,const float** ranges, bool uniform = true, bool accumulate = false );该函数能够同时计算多个图像,多个通道,不同灰度范围的灰度直⽅图.其参数如下:images ,输⼊图像的数组,这些图像要有相同⼤⼤⼩,相同的深度(CV_8U CV_16U CV_32F ).nimages ,输⼊图像的个数channels ,要计算直⽅图的通道个数。
基于OpenCV图像处理系统的开发与实现刘培军;马明栋;王得玉【摘要】In the research of digital image processing technology, when a small number of images are processed, various image processing algorithms are generally used for programming according to different requirements, and there are a lot of repetitive work. However, when the amount of digital image data is large and the real-time requirement of processed images is high, all images are processed, codes and algorithms are written manually, which is quite difficult and inefficient. In order to effectively solve the above problems, based on OpenCV computer vision library and under the integrated development environment of Qt Creator, we develop and implement an image processing system of object-oriented programming with better interface and convenient for users. The practice of digital image processing shows that the system can process images efficiently and quickly.%在数字图像处理技术的研究过程中,基于平时对少量图像进行处理时,一般都是针对不同需求运用各种图像处理算法进行编程,存在着许多重复性工作.而当数字图像数据量非常大且对处理的图像实时性要求非常高时,对所有图像进行处理,代码以及算法的实现都通过人工进行编写,存在着相当大的难度且效率十分低下.为有效解决上述问题,以OpenCV计算机视觉库为基础,在Qt Creator 集成开发环境下,采用面向对象编程,开发并实现了一款界面良好,方便用户使用的图像处理系统.通过对大量数字图像处理的实践表明,该系统能够有效快速地对图像进行处理.【期刊名称】《计算机技术与发展》【年(卷),期】2019(029)003【总页数】5页(P127-131)【关键词】图像处理算法;OpenCV;Qt Creator;面向对象;图像处理系统【作者】刘培军;马明栋;王得玉【作者单位】南京邮电大学通信与信息工程学院, 江苏南京 210003;南京邮电大学地理与生物信息学院, 江苏南京 210023;南京邮电大学地理与生物信息学院, 江苏南京 210023【正文语种】中文【中图分类】TP3020 引言在计算机技术如此成熟的今天,图像处理理论与技术已经得到了较为全面的发展并在持续不断的优化创新中,尤其在人工智能、航空航天、工业部件检测、交通、医学等领域得到了广泛应用[1-2]。
equalizehist的c++用法equalizeHist 是OpenCV 库中的一个函数,用于对图像进行直方图均衡化,增强图像的对比度。
在C++ 中使用这个函数的基本语法如下:cppvoid equalizeHist(InputArray src, OutputArray dst);参数说明:src:输入图像,必须是灰度图像。
dst:输出图像,是均衡化后的图像。
下面是一个简单的示例代码,展示如何使用equalizeHist 函数:cpp#include <opencv2/opencv.hpp>#include <iostream>int main() {// 读取灰度图像cv::Mat src = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);if (src.empty()) {std::cerr << "无法读取图像!" << std::endl;return -1;}// 创建输出图像矩阵cv::Mat dst;// 进行直方图均衡化cv::equalizeHist(src, dst);// 显示原图和均衡化后的图像cv::namedWindow("原图", cv::WINDOW_NORMAL);cv::imshow("原图", src);cv::namedWindow("均衡化后", cv::WINDOW_NORMAL);cv::imshow("均衡化后", dst);// 等待用户按下任意键退出cv::waitKey(0);return 0;}在这个示例中,我们首先读取一个灰度图像,然后创建一个输出图像矩阵。
接着,我们调用equalizeHist 函数对输入图像进行直方图均衡化,并将结果存储在输出图像矩阵中。
直⽅图对⽐(两个直⽅图的相似性如何度量)本⽂档尝试解答如下问题:如何使⽤OpenCV函数产⽣⼀个表达两个直⽅图的相似度的数值。
如何使⽤不同的对⽐标准来对直⽅图进⾏⽐较。
原理要⽐较两个直⽅图( and ), ⾸先必须要选择⼀个衡量直⽅图相似度的对⽐标准 () 。
OpenCV 函数执⾏了具体的直⽅图对⽐的任务。
该函数提供了4种对⽐标准来计算相似度:1. Correlation ( CV_COMP_CORREL )其中是直⽅图中bin的数⽬。
2. Chi-Square ( CV_COMP_CHISQR )3. Intersection ( CV_COMP_INTERSECT )4. Bhattacharyya 距离( CV_COMP_BHATTACHARYYA )源码本程序做什么?装载⼀张基准图像和两张测试图像进⾏对⽐。
产⽣⼀张取⾃基准图像下半部的图像。
将图像转换到HSV格式。
计算所有图像的H-S直⽅图,并归⼀化以便对⽐。
将基准图像直⽅图与两张测试图像直⽅图,基准图像半⾝像直⽅图,以及基准图像本⾝的直⽅图分别作对⽐。
显⽰计算所得的直⽅图相似度数值。
下载代码: 点击代码⼀瞥:#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include <iostream>#include <stdio.h>using namespace std;using namespace cv;/** @函数 main */int main( int argc, char** argv ){Mat src_base, hsv_base;Mat src_test1, hsv_test1;Mat src_test2, hsv_test2;Mat hsv_half_down;/// 装载三张背景环境不同的图像if( argc < 4 ){ printf("** Error. Usage: ./compareHist_Demo <image_settings0> <image_setting1> <image_settings2>\n");return -1;}src_base = imread( argv[1], 1 );src_test1 = imread( argv[2], 1 );src_test2 = imread( argv[3], 1 );/// 转换到 HSVcvtColor( src_base, hsv_base, CV_BGR2HSV );cvtColor( src_test1, hsv_test1, CV_BGR2HSV );cvtColor( src_test2, hsv_test2, CV_BGR2HSV );hsv_half_down = hsv_base( Range( hsv_base.rows/2, hsv_base.rows - 1 ), Range( 0, hsv_base.cols - 1 ) );/// 对hue通道使⽤30个bin,对saturatoin通道使⽤32个binint h_bins = 50; int s_bins = 60;int histSize[] = { h_bins, s_bins };// hue的取值范围从0到256, saturation取值范围从0到180float h_ranges[] = { 0, 256 };float s_ranges[] = { 0, 180 };const float* ranges[] = { h_ranges, s_ranges };// 使⽤第0和第1通道int channels[] = { 0, 1 };/// 直⽅图MatND hist_base;MatND hist_half_down;MatND hist_test1;MatND hist_test2;/// 计算HSV图像的直⽅图calcHist( &hsv_base, 1, channels, Mat(), hist_base, 2, histSize, ranges, true, false );normalize( hist_base, hist_base, 0, 1, NORM_MINMAX, -1, Mat() );calcHist( &hsv_half_down, 1, channels, Mat(), hist_half_down, 2, histSize, ranges, true, false );normalize( hist_half_down, hist_half_down, 0, 1, NORM_MINMAX, -1, Mat() );calcHist( &hsv_test1, 1, channels, Mat(), hist_test1, 2, histSize, ranges, true, false );normalize( hist_test1, hist_test1, 0, 1, NORM_MINMAX, -1, Mat() );calcHist( &hsv_test2, 1, channels, Mat(), hist_test2, 2, histSize, ranges, true, false );normalize( hist_test2, hist_test2, 0, 1, NORM_MINMAX, -1, Mat() );///应⽤不同的直⽅图对⽐⽅法for( int i = 0; i < 4; i++ ){ int compare_method = i;double base_base = compareHist( hist_base, hist_base, compare_method );double base_half = compareHist( hist_base, hist_half_down, compare_method );double base_test1 = compareHist( hist_base, hist_test1, compare_method );double base_test2 = compareHist( hist_base, hist_test2, compare_method );printf( " Method [%d] Perfect, Base-Half, Base-Test(1), Base-Test(2) : %f, %f, %f, %f \n", i, base_base, base_half , base_test1, base_test2 ); }printf( "Done \n" );return 0;}解释1. 声明储存基准图像和另外两张对⽐图像的矩阵( RGB 和 HSV )Mat src_base, hsv_base;Mat src_test1, hsv_test1;Mat src_test2, hsv_test2;Mat hsv_half_down;2. 装载基准图像(src_base) 和两张测试图像:if( argc < 4 ){ printf("** Error. Usage: ./compareHist_Demo <image_settings0> <image_setting1> <image_settings2>\n");return -1;}src_base = imread( argv[1], 1 );src_test1 = imread( argv[2], 1 );src_test2 = imread( argv[3], 1 );3. 将图像转化到HSV格式:cvtColor( src_base, hsv_base, CV_BGR2HSV );cvtColor( src_test1, hsv_test1, CV_BGR2HSV );cvtColor( src_test2, hsv_test2, CV_BGR2HSV );4. 同时创建包含基准图像下半部的半⾝图像(HSV格式):hsv_half_down = hsv_base( Range( hsv_base.rows/2, hsv_base.rows - 1 ), Range( 0, hsv_base.cols - 1 ) );5. 初始化计算直⽅图需要的实参(bins, 范围,通道 H 和 S ).int h_bins = 50; int s_bins = 32;int histSize[] = { h_bins, s_bins };float h_ranges[] = { 0, 256 };float s_ranges[] = { 0, 180 };const float* ranges[] = { h_ranges, s_ranges };int channels[] = { 0, 1 };6. 创建储存直⽅图的 MatND 实例:MatND hist_base;MatND hist_half_down;MatND hist_test1;MatND hist_test2;7. 计算基准图像,两张测试图像,半⾝基准图像的直⽅图:calcHist( &hsv_base, 1, channels, Mat(), hist_base, 2, histSize, ranges, true, false );normalize( hist_base, hist_base, 0, 1, NORM_MINMAX, -1, Mat() );calcHist( &hsv_half_down, 1, channels, Mat(), hist_half_down, 2, histSize, ranges, true, false );normalize( hist_half_down, hist_half_down, 0, 1, NORM_MINMAX, -1, Mat() );calcHist( &hsv_test1, 1, channels, Mat(), hist_test1, 2, histSize, ranges, true, false );normalize( hist_test1, hist_test1, 0, 1, NORM_MINMAX, -1, Mat() );calcHist( &hsv_test2, 1, channels, Mat(), hist_test2, 2, histSize, ranges, true, false );normalize( hist_test2, hist_test2, 0, 1, NORM_MINMAX, -1, Mat() );8. 按顺序使⽤4种对⽐标准将基准图像(hist_base)的直⽅图与其余各直⽅图进⾏对⽐:for( int i = 0; i < 4; i++ ){ int compare_method = i;double base_base = compareHist( hist_base, hist_base, compare_method );double base_half = compareHist( hist_base, hist_half_down, compare_method );double base_test1 = compareHist( hist_base, hist_test1, compare_method );double base_test2 = compareHist( hist_base, hist_test2, compare_method );printf( " Method [%d] Perfect, Base-Half, Base-Test(1), Base-Test(2) : %f, %f, %f, %f \n", i, base_base, base_half , base_test1, base_test2 );}结果1. 使⽤下列输⼊图像:第⼀张为基准图像,其余两张为测试图像。
OpenCV16位深度图⽚显⽰并保存项⽬需要,要将cmos相机的数据读出来,并显⽰出图⽚来。
同事已经通过FPGA+USB的⽅式,把相机并⾏数据转成串⾏,我需要做的就是上位机,找到frame valid和line valid有位,读取⼀个frame的数据后,显⽰出来。
设计思路:三个thread,第⼀个从usb读数据,第⼆个处理usb数据包,找frame valid 和 line valid,第三个负责显⽰;显⽰部分通过定义IplImage指针,分配空间,然后通过给imdata赋值,来实现显⽰。
因为相机是⿊⽩相机,处理难度不⼤。
之前的每个pixel都是8个bits,所以opencv显⽰起来很容易。
但是后来,上级要求每个pixel要有10个bits来表⽰,本以为很容易实现,后来搞了2天才搞定,决定总结⼀下经验,供需要的朋友参考⼀下。
1. opencv 图像深度图像深度是指存储每个像素所⽤的位数,也⽤于量度图像的⾊彩分辨率.图像深度确定彩⾊图像的每个像素可能有的颜⾊数,或者确定灰度图像的每个像素可能有的灰度级数.它决定了彩⾊图像中可出现的最多颜⾊数,或灰度图像中的最⼤灰度等级.⽐如⼀幅单⾊图像,若每个象素有8位,则最⼤灰度数⽬为2的8次⽅,即256.⼀幅彩⾊图像RGB3个分量的象素位数分别为4,4,2,则最⼤颜⾊数⽬为2的4+4+2次⽅,即1024,就是说像素的深度为10位,每个像素可以是1024种颜⾊中的⼀种.opencv 深度显⽰范围:(也就是说当定义了如下不同深度的时候,像素的灰度值要处于显⽰范围之中才可以显⽰出来。
否则要进⾏转换)测试double型:0.0--1.0之间 IPL_DEPTH_64F测试float型:0.0--1.0之间 IPL_DEPTH_32F测试long型:0--65535之间 IPL_DEPTH_32S测试short int型:-32768--32767之间 IPL_DEPTH_16S测试unsigned short int型:0--65535之间 IPL_DEPTH_16U测试char型:-128--127之间 IPL_DEPTH_8S测试unsigned char型:0--255之间 IPL_DEPTH_8U2. 图像深度转换当定义了如下的深度为16的IplImageIplImage* dst = cvCreateImage(cvGetSize(img),IPL_DEPTH_16U,img->nChannels);对其进⾏赋值,先把imdata强制转换成unsigned short型1 <span style="font-size:18px;">unsigned short* data = (unsigned short *)(pImg->imageData)2for ( i=0;i<HEIGH;i++)3for( j=0;j<WIDTH;j++)4 {5 data[j+i*(WIDTH)] = array[j+i*(WIDTH)];6 }</span>处理完后要对其进⾏显⽰。