C++ 彩色图像(RGB)三通道直方图计算和绘制,图像逆时针旋转90° 实现代码
#include "iostream"
#include "opencv2/opencv.hpp"
#include "vector" using namespace std;
using namespace cv; /*计算真彩色图像的直方图*/
void splitRgbImgPro(const Mat img, vector<Mat>& imgRGB);
void calImgHistPro(vector<Mat> imgrgb, vector<vector<int>>& histData);
void showImgHistPro(vector<vector<int>>& histD);
void rotateImgPro(Mat& img, float angle);
int main()
{
Mat imgSrc = imread("E:\\VideoPlateRecog\\ETC\\1008\\SRC\\144.bmp");
/*色彩空间分离*/
vector<Mat> imgRGB;
splitRgbImgPro(imgSrc, imgRGB);
/*计算三通道直方图*/
vector<vector<int>> histData;
calImgHistPro(imgRGB, histData);
/*绘制三通道直方图*/
showImgHistPro(histData); system("pause");
return ;
} void calImgHistPro(vector<Mat> imgrgb,vector<vector<int>>& histData)
{
vector<Mat> imgrgbSrc = imgrgb;
int width = imgrgb[].cols;
int height = imgrgb[].rows;
for (int n = ; n < imgrgb.size(); n++)
{
Mat imgSrc = imgrgbSrc[n].clone();
int img_sum = -;
vector<int> p();
for (int m = ; m <p.size() ; m++)
{
p[m] = ;
}
for (int i = ; i < height; i++)
{
uchar* ptr = imgSrc.ptr<uchar>(i);
for (int j = ; j < width; j++)
{
int k = ptr[j];
p[k]++;
}
}
/*find max element of vector*/
for (auto it = p.begin(); it != p.end(); it++)
{
if (*it > img_sum)
{
img_sum = *it;
}
}
for (int m = ; m < ; m++)
{
p[m] = p[m]* / img_sum;
}
histData.push_back(p);
}
} void showImgHistPro(vector<vector<int>>& histD)
{
vector<vector<int>> histSrc=histD;
int cols = histD[].size();
int rows = -;
Mat histRGB(cols , cols * , CV_8UC1, Scalar());
for (int n = ; n < histD.size(); n++)
{
vector<int> hist = histD[n];
Mat histImg(cols, cols, CV_8UC1, Scalar());
for (int i = ; i < cols; i++)
{
uchar* ptr = histImg.ptr(i);
for (int j = ; j < hist[i]; j++)
{
ptr[j] = ;
}
}
/*旋转90°*/
Mat histImg1(cols, cols, CV_8UC1, Scalar());
for (int l = ; l < cols; l++)
{
for (int k = ; k < cols; k++)
{
histImg1.at<uchar>(l, k) = histImg.at<uchar>(k, cols-l-);
}
}
histImg1.copyTo(histRGB(Rect(cols*n,, cols, cols)));
}
imshow("Img_R_G_B", histRGB);
waitKey();
} void rotateImgPro(Mat& img,float angle)
{
Mat retMat(img.cols, img.rows, CV_8UC1, Scalar());
float anglePI = (float)(angle*CV_PI / );
int xSm, ySm;
for (int i = ; i < retMat.rows; i++)
{
for (int j = ; j < retMat.cols; j++)
{
xSm = (int)((i - retMat.rows / )*cos(anglePI) -
(j - retMat.cols / )*sin(anglePI) + 0.5);
ySm = (int)((i - retMat.rows / )*sin(anglePI) +
(j - retMat.cols / )*cos(anglePI) + 0.5);
retMat.at<uchar>(i, j) = img.at<uchar>(xSm, ySm); }
}
} void splitRgbImgPro(const Mat img, vector<Mat>& imgRGB)
{
Mat imgSrc = img.clone();
int width = imgSrc.rows;
int height = imgSrc.cols;
Mat imgR(width, height, CV_8UC1);
Mat imgG(width, height, CV_8UC1);
Mat imgB(width, height, CV_8UC1);
for (int i = ; i < width; i++)
{
Vec3b* imgPtr = imgSrc.ptr<Vec3b>(i);
uchar* imgSPtr = imgSrc.ptr<uchar>(i);
uchar* imgRPtr = imgR.ptr<uchar>(i);
uchar* imgGPtr = imgG.ptr<uchar>(i);
uchar* imgBPtr = imgB.ptr<uchar>(i);
for (int j = ; j < height; j++)
{
imgRPtr[j] = imgSPtr[];
imgGPtr[j] = imgSPtr[];
imgBPtr[j] = imgSPtr[];
imgSPtr += ;
}
}
imgRGB.push_back(imgR);
imgRGB.push_back(imgG);
imgRGB.push_back(imgB);
}
C++ 彩色图像(RGB)三通道直方图计算和绘制,图像逆时针旋转90° 实现代码的更多相关文章
- 多通道(比方RGB三通道)卷积过程
今天一个同学问 卷积过程好像是对 一个通道的图像进行卷积, 比方10个卷积核,得到10个feature map, 那么输入图像为RGB三个通道呢,输出就为 30个feature map 吗, 答案肯定 ...
- opencv —— calcHist、minMaxLoc 计算并绘制图像直方图、寻找图像全局最大最小值
直方图概述 简单来说,直方图就是对数据进行统计的一种方法,这些数据可以是梯度.方向.色彩或任何其他特征.它的表现形式是一种二维统计表,横纵坐标分别是统计样本和该样本对应的某个属性的度量. 计算直方图: ...
- OpenCV——RGB三通道分离
opencv 和 matlab 在处理彩色图像的时候,通道的存储顺序是不同的. matlab 的排列顺序是R,G,B: 而在opencv中,排列顺序是B,G,R. 下面通过一个小程序看看opencv中 ...
- OpenCV绘制图像中RGB三个通道的直方图
一开始是看<OpenCV计算机视觉编程攻略(第2版)>这本书学做直方图,但是书本里说直方图的部分只详细说了黑白图像(单通道)的直方图绘制方法,RGB图像的直方图只说了如何计算,没有说计算完 ...
- OpenCV 学习笔记(8)彩色图像RGB通道的分离、合并与显示
https://blog.csdn.net/ZYTTAE/article/details/42234989 由于算法的需要,需要把彩色图像的R.G.B值分离出来,OpenCV中正好有split() 和 ...
- 纯Python综合图像处理小工具(1)分通道直方图
平时工作经常需要做些图像分析,需要给图像分通道,计算各个通道的直方图分布特点,这个事儿photoshop也能做,但是用起来不方便,且需要电脑上安装有PS软件,如果用OpenCV, 更是需要在visua ...
- Halcon一日一练:创建三通道图像
首先理解一个什么是三通道图像: 三通道图像就是彩色图像,我们之前黑白相机或黑白电视机都是彩用的灰阶图像,即单通道图像,一般是2的8次方个灰阶,即256个灰阶.彩色图像采用RGB,红绿蓝三个通道来合成彩 ...
- Halcon学习之三:有关图像通道的函数(R是三通道,B是1通道,G二通道),排列顺序BGR
黑白摄像机会返回每个像素所对应的能量采用结果,这些结果组成了一幅单通道灰度值图像,而对于RGB彩色摄像机,它将返回每个像素所对应的三个采样结果,也就是一幅三通道图像.下面这些是与图像通道有关的函数: ...
- STM32F10x_ADC三通道DMA连续转换(3通道、软件单次触发)
Ⅰ.概述 上一篇文章讲述的内容是:三通道逐次转换(单次.单通道软件触发),也就是说3条通道要三次软件触发才能完成转换,而且是通过软件读取转换数值. 本文讲述三通道DMA连续转换(3通道.软件单次触发) ...
随机推荐
- 影视感悟专题---1、B站-魔兽世界代理及其它乱七八糟
影视感悟专题---1.B站-魔兽世界代理及其它乱七八糟 一.总结 一句话总结: 看过的东西都可以学下,这样既可以学习那些东西,都是对自己生活学习有帮助的,还可以弥补自己每天学的东西的不够 1.< ...
- java中的本地缓存
java中的本地缓存,工作后陆续用到,一直想写,一直无从下手,最近又涉及到这方面的问题了,梳理了一下.自己构造单例.guava.ehcache基本上涵盖了目前的大多数行为了. 为什么要有本地缓存? ...
- webpack-使用html-webpack-plugin和ejs-loader将侧栏、头部、底部公共html做成模板,并生成合并后的html页面
在学习前端自动化之前一直使用 PHP,JSP 将在每个页面将头部.侧栏.底部等部分引入,现在前端 "娱乐圈" 一直噼里啪啦的每天出新东西,自从接触了前端自动化我就觉得这种工作可以交 ...
- Python笔记(十二)_文件
文件的打开模式 'r':以只读的方式打开文件(默认) 'w':以写入的方式打开文件,会覆盖已存在的文件 'x':用写入的方式打开文件,如果文件已存在,会抛出异常 'a':用写入的方式打开文件,如果文件 ...
- 【ABAP系列】SAP ABAP与Java数据类型的对应关系
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP与Java数据类 ...
- 手撸红黑树-Red-Black Tree 入门
一.学习红黑树前的准备: 熟悉基础数据结构 了解二叉树概念 二.红黑树的规则和规则分析: 根节点是黑色的 所有叶子节点(Null)是黑色的,一般会认定节点下空节点全部为黑色 如果节点为红色,那么子节点 ...
- 边界安全 - CDN/DMZ/网络协议
CDN 工具 - LuManager CDN DMZ 网络协议 - DNS Win7下搭建DNS服务器 - BIND 根域 顶级域(即相关国家域名管理机构的数据库,如中国的CNNIC) com n ...
- 结合process进程,实现进程之间的通讯Queue,稍微复杂的运用
#在父进程中创建两个子进程,一个往Queue写数据,一个从Queue里读数据 from multiprocessing import Queue,Process import time,random ...
- jQuery基础--动画操作
三组基本动画 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=" ...
- docker hub 本地镜像登录
docker的登录信息存放在home目录下的.docker文件夹下,查看 cat ~/.docker/config.json { "auths": { "gcyimgs. ...