野兽先辈带您学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 ...
随机推荐
- 性能优化之使用HTTP2.0
HTTP2.0 的优势 配置 测试 怎么查看当前网站http版本 chrome HTTP协议版本检测 Chrome 控制台 window.chrome.loadTimes() { commitLoad ...
- 前端打包发布以及小程序发布(IIS下部署前端站点)
作为后端程序员 一直没有摸索过前端项目的打包发布,因为项目需要 这次经历一个 前端项目以及小程序的打包发布,记录一下. 一.前端部署 部署过程种一直出现node-sass 问题 https:/ ...
- 一个基于 .NET 开源免费的异地组网和内网穿透工具
前言 今天大姚给大家分享一个基于 .NET 开源免费的异地组网和内网穿透工具:linker. 工具介绍 linker是一个基于 .NET8 开源免费(GPL-2.0 license)的异地组网和内网穿 ...
- DeepseekScanner deepseek+python实现代码审计实战
一.功能概述 DeepseekScanner实现了扫描源代码项目中的所有代码文件发送给deepseek进行安全审计的功能.具体细节包括扫描所有子目录中的代码文件,然后依次将代码文件切片发送到deeps ...
- 面试官:如果某个业务量突然提升100倍QPS你会怎么做?
"假设你负责的系统,某个业务线的QPS突然暴增100倍,你会怎么应对?" --这是上周朋友去面试,被问到一道题,他答了"加机器扩容",结果面试官眉头一皱:&qu ...
- 如何在 MySQL 中监控和优化慢 SQL?
如何在 MySQL 中监控和优化慢 SQL? 在 MySQL 中,慢 SQL 查询是指那些执行时间较长的查询,通常会影响数据库的性能和响应时间.通过监控和优化这些慢 SQL 查询,可以提高数据库的效率 ...
- kette介绍-Step之Merge Join
Merge Join介绍 需要配合Sort rows使用,对关联字段进行排序 关联两个step数据,可以是两个不同的数据库表数据,也可以是一张表,一个文件,输出字段为两张表所有字段 注意将小数据集作为 ...
- windows里的一些常用的dos命令
--------------------------------------------- 1. 中断命令执行 Ctrl + Z 2. 文件/目录 cd 切换目录 例:cd // 显示当前目录 ...
- Email邮箱验证码发送
以下文件保存到/static/email.txt <!DOCTYPE html> <html lang="en" xmlns:th="http://ww ...
- sonarqube+gitlab+jenkins+maven集成搭建(四)
安装Gitlab 关闭firewalld防火墙和selinux防火墙,如图1-2:[root@localhost ~]# systemctl stop firewalld[root@localhost ...