野兽先辈带您学Opencv:介绍直方图,直方图均衡化,直方图计算,实战利用直方图计算蛋的面积
欧,又是坑爹的opencv实验,它又来了额
实验要求:
1.输入三通道RGB直方图
2.直方图均衡化后输出图片及直方图
3.计算鸡蛋的面积(像素数)
首先什么是直方图?
横坐标是灰度,纵坐标是每一个灰度对应出现的频率,现在的彩色图象对应的直方图是R,G,B方向的,灰度不仅只有灰白通道有
直方图均衡化作用:提高图像对比度,拉伸灰度值范围,它有一个算法:


代码示例:
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream> using namespace cv;
using namespace std; int main(int, char** argv)
{
Mat src, dst;
char* yuanlaide = (char*)"yuanlaide";
char* bianhuahoude = (char*)"bianhuahoude"; src = imread("C:/echou.jpg");
if (src.empty()) { return 0; };
cvtColor(src, src, COLOR_BGR2GRAY);
equalizeHist(src, dst); // 直方图
imshow(yuanlaide, src);
imshow(bianhuahoude, dst); waitKey(0);
return 0;
}
最终显示结果如下:
原图像

变化后的图象:

感觉似乎更臭了
任务2:计算图片直方图
在开始之前我们先看一个Opencv计算直方图的算法:
void cv::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输入图象数据,channels对应的rgb通道,https://www.cnblogs.com/phoenixdsg/p/8280362.html这里有一个详细说明这个算法的帖子大家可以看看
输出rgb代码如下:
#include "opencv2/highgui.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream> using namespace std;
using namespace cv; int main( )
{
Mat src, dst; src = imread("C:/echo.jpg");
if (src.empty()) { return -1; } vector<Mat> bgr_planes; // 矩阵向量
split(src, bgr_planes); // 将多通道图像分为多个单通道图像 int histSize = 256; float range[] = { 0,256 };
const float* histRange = { range }; // 必须加const,否则报错 bool uniform = true; // 直方图是否分布均匀
bool accumulate = false; // 如果为true,在开始分配时直方图不会被清除 Mat b_hist, g_hist, r_hist; calcHist(&bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histSize, &histRange, uniform, accumulate);
calcHist(&bgr_planes[1], 1, 0, Mat(), g_hist, 1, &histSize, &histRange, uniform, accumulate);
calcHist(&bgr_planes[2], 1, 0, Mat(), r_hist, 1, &histSize, &histRange, uniform, accumulate); int hist_w = 512, hist_h = 400; // 直方图的横纵范围
int bin_w = cvRound((double)hist_w / histSize); // 每个柱状的宽度 Mat histImage(hist_h, hist_w, CV_8UC3, Scalar(0, 0, 0)); normalize(b_hist, b_hist, 9, histImage.rows, NORM_MINMAX, -1, Mat()); // 归一化
normalize(g_hist, g_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());
normalize(r_hist, r_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat()); for (int i = 1; i < histSize; i++) // 绘制直线
{
line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(b_hist.at<float>(i - 1))),
Point(bin_w*(i), hist_h - cvRound(b_hist.at<float>(i))),Scalar(255, 0, 0), 2, 8, 0);
line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(g_hist.at<float>(i - 1))),
Point(bin_w*(i), hist_h - cvRound(g_hist.at<float>(i))),Scalar(0, 255, 0), 2, 8, 0);
line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(r_hist.at<float>(i - 1))),
Point(bin_w*(i), hist_h - cvRound(r_hist.at<float>(i))),Scalar(0, 0, 255), 2, 8, 0);
} imshow("calcHist Demo", histImage);
waitKey(0);
return 0;
}
运行之后输出了恶臭先辈的直方图

紧接着就是万众瞩目的计算鸡蛋面积
看看这个蛋,表面上只是一个蛋,其实它不是普通的蛋,它是一种叫做“公鸡蛋”的蛋

什么?公鸡为什么会下蛋呢?公鸡生来就有蛋蛋啊,这不是显而易见的事情吗?
废话不多说,直接开搞!
先考虑对这一张图片进行处理,进行高斯滤波
Mat dst,dstGray,thres;
Mat img = imread("C:/egg.jpg");
GaussianBlur(img, dst, Size(7,7), 0); //高斯变换
紧接着考虑进行灰度变换后二值化,变成只有黑和白的两种颜色,这样可以方便处理
cvtColor(dst,dstGray, CV_BGR2GRAY); //灰度化
threshold(dstGray, thres, 80, 255, CV_THRESH_BINARY);
紧接着考虑对二值化后的图片进行平滑处理
Mat kernel = getStructuringElement(MORPH_RECT,Size(3,3),Point(-1,-1));
morphologyEx(thres,morp,MORPH_CLOSE,kernel,Point(1,-1),2);
现在开始进行正式的计算了,这里原理是计算白色区块的总像素个数
vector<vector<Point>>contours;
vector<Vec4i>hireachy;
findContours(morp,contours,hireachy,CV_RETR_EXTERNAL,CHAIN_APPROX_SIMPLE,Point());
Mat result = Mat::zeros(img.size(),CV_8UC3);
for (size_t t = 0; t < contours.size(); t++) {
Rect rect = boundingRect(contours[t]);
if (rect.width < img.cols / 2)
{
continue;
}
if (rect.width > img.cols - 20)
{
continue;
}
double area = contourArea(contours[t]);
double len = arcLength(contours[t], true);
drawContours(result, contours, static_cast<int>(t), Scalar(0, 0, 255), 1, 8, hireachy);
cout << area << endl;
}
好了,到这里输出了area的大小,也就是鸡蛋的面积。
谢谢各位!
野兽先辈带您学Opencv:介绍直方图,直方图均衡化,直方图计算,实战利用直方图计算蛋的面积的更多相关文章
- 【凯子哥带你学Framework】Activity界面显示全解析(下)
咱们接着上篇继续讲,上篇没看的请戳:[凯子哥带你学Framework]Activity界面显示全解析(上) 如何验证上一个问题 首先,说明一下运行条件: //主题 name="AppThem ...
- 手摸手带你学移动端WEB开发
HTML常用标签总结 手摸手带你学CSS HTML5与CSS3知识点总结 手摸手带你学移动端WEB开发 好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/Ro ...
- OpenCV绘制图像中RGB三个通道的直方图
一开始是看<OpenCV计算机视觉编程攻略(第2版)>这本书学做直方图,但是书本里说直方图的部分只详细说了黑白图像(单通道)的直方图绘制方法,RGB图像的直方图只说了如何计算,没有说计算完 ...
- 我要带徒弟学写JAVA架构,引路架构师之路(Jeecg开源社区)
带徒弟学JAVA架构(Jeecg社区) Java程序员如何打破工作2,3年的瓶颈问题,如何更上一层楼? 太多的巧合,让我接触到了开源,通过JEECG与很多朋友交流后,让我有了帮助别 ...
- OpenCV 学习(计算图像的直方图)
OpenCV 计算图像的直方图 计算图像的直方图是图像处理领域一个非经常见的基本操作. OpenCV 中提供了 calcHist 函数来计算图像直方图.只是这个函数说实话挺难用的,研究了好久才掌握了些 ...
- 带你学C带你飞!
C语言免费课程推荐:带你学C带你飞! 想学习C语言,首先就要了解什么是C语言: C语言是一门通用计算机编程语言,应用广泛.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码 ...
- 老段带你学鸟哥Linux视频教程 包含基础班+提高班
老段带你学鸟哥Linux视频教程 包含基础班+提高班,附带pdf文档. 目录结构如下: 目录:/-老段带你学鸟哥Linux视频教程 [.9G] ┣━━老段带你学鸟哥-服务器篇 [1009.4M] ┃ ...
- OpenCV开发笔记(七十三):红胖子8分钟带你使用opencv+dnn+yolov3识别物体
前言 级联分类器的效果并不是很好,准确度相对深度学习较低,上一章节使用了dnn中的tensorflow,本章使用yolov3模型,识别出具体的分类. Demo 320x320,置信度0 ...
- 《跟老男孩学Linux运维:Web集群实战》读书笔记
Linux 介绍 Linux 安装 Linux 调优 Web 基础 Nginx 应用 LNMP 应用 PHP 缓存加速 Nginx 调优 MySQL 应用 NFS 网络文件共享 Nginx 反向代理与 ...
- 机器学习进阶-直方图与傅里叶变化-直方图均衡化 1.cv2.equalizeHist(进行直方图均衡化) 2. cv2.createCLAHA(用于生成自适应均衡化图像)
1. cv2.equalizeHist(img) # 表示进行直方图均衡化 参数说明:img表示输入的图片 2.cv2.createCLAHA(clipLimit=8.0, titleGridSiz ...
随机推荐
- AOT编译Avalonia应用:StarBlog Publisher项目实践与挑战
前言 最近我使用 Avalonia 开发了一个文章发布工具,StarBlog Publisher. Avalonia 是一个跨平台的 UI 框架,它可以在 Windows.Linux 和 macOS ...
- 【SpringCloud】各种组件的更新情况
关于Cloud各种组件的停更/升级/替换 由停更引发的"升级惨案" 停更不停用 被动修复bugs 不再接受合并请求 不再发布新版本 以前 now2020 服务注册中心 Eureka ...
- 【Python】导出docx格式Word文档中的文本、图片和附件等
[Python]导出docx格式Word文档中的文本.图片和附件等 零.需求 为批量批改学生在机房提交的实验报告,我需要对所有的实验文档内容进行处理.需要批量提取Word文档中的图片和附件以便进一步检 ...
- 阿里云ECS下安装的MySQL无法远程连接?
场景重现 在阿里云ECS下, Ubuntu系统上通过以下命令安装的MySQL数据库, 本地连接正常, 但远程死活连接不上. # 安装MySQL apt-get install mysql-server ...
- SQL SERVER日常运维巡检系列之-实例级参数
前言 做好日常巡检是数据库管理和维护的重要步骤,而且需要对每次巡检日期.结果进行登记,同时可能需要出一份巡检报告. 本系列旨在解决一些常见的困扰: 不知道巡检哪些东西不知道怎么样便捷体检机器太多体检麻 ...
- Spring RestTemplate使用方法总结
1. 引入依赖 首先,需要确认项目中是否直接或者间接引入过spring-web依赖,如果没有引入过,需要在pom.xml中添加以下代码引入依赖: <dependency> <grou ...
- QT 可绑定属性 QProperty QObjectBindableProperty QObjectComputedProperty,简化信号、槽(SIGNAL、SLOT)机制的方法
QT提供的可绑定属性是指这些属性可以绑定到其他值或表达式上(通常是 C++ lambda 表达式).如果属性是通过表达式进行绑定,该属性会跟随表达式自动更新.可绑定属性由 QProperty 类和 Q ...
- Golang服务可观测和思路分享
省流 中医四诊"望闻问切"与程序诊断有异曲同工之妙.在Golang问题排查中,我们需要建立系统化的诊断思维:通过观察表象(望).收集信息(闻).追溯根源(问).精准施治(切)四个维 ...
- thinkphp 命令行执行导入
<?phpdeclare (strict_types=1);namespace app\command;use think\console\Command;use think\console\I ...
- 领域驱动的事实与谬误 一 DDD 与 MVC
本文有以下几个目的: 让新手少交智商税,少浪费时间看一些软文. 普及一个基本概念:了解一项观点的提出年代和最初初衷,才能更好地掌握其精粹. 我想指出市场上一些误人子弟的软文. 首先说明:文中所说的谬误 ...