野兽先辈带您学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 ...
随机推荐
- ORA-28001:口令已经失效
Oracle用户口令默认的有效期导致的一个异常,留爪. Oralce11G下,创建的用户及口令,也就是用户密码默认会有个180天的过期时间, 如果超过180天用户口令未做修改,则该用户口令失效,也就是 ...
- leetcode每日一题:最小化字符串长度
题目 2716. 最小化字符串长度 给你一个下标从 0 开始的字符串 s ,重复执行下述操作 任意 次: 在字符串中选出一个下标 i ,并使 c 为字符串下标 i 处的字符.并在 i 左侧(如果有)和 ...
- Python 潮流周刊#96:MCP 到底是什么?(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- mybatis-plus之配置安全
1. 环境 SpringBoot 2.6.x 2. 介绍 MyBatis-Plus 从3.3.2版本开始提供了数据安全保护功能,MyBatis-Plus 支持通过加密配置来增强数据库的安全性. 3. ...
- Asp.net mvc基础(十四)Entity Framework
一.EntityFramework介绍 1.ORM:Object Relation Mapping,用操作对象的方式来操作数据库 2.ORM工具有很多,其中Dapper.PetaPoco.NHiber ...
- 理解tomcat中的BIO、NIO、AIO、ARP
理解tomcat中的BIO.NIO.AIO.ARP tomcat作为springboot中默认的web容器,了解tomcat的运转可以帮助我们更好的去调整tomcat的参数达到更好的性能 前置知识 I ...
- win mysql实现主从同步(精简版)
最近项目要弄读写分离,那首先要实现主从同步啊,网上教程很多,但大多都看得云里雾里,so,有了这个精简版: 主库my.ini添加配置: #数据库ID号, 为1时表示为Master,其中master_id ...
- 微信小程序 6/12 的坑
配置 小程序的时候配置请求的是 https://xxx 不是http://xxx 前端请求的链接都是https
- Java IO--利用内存流实现转大写的操作
package demo; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java ...
- [随记]-SpringMVC中的handler到底是什么东西
HandlerMapping 初始化时候的 HandlerMapping 有,按顺序排列: requestMappingHandlerMapping beanNameHandlerMapping -& ...