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通道.软件单次触发) ...
随机推荐
- java 中的运算符
Java的运算符,分为四类: 算数运算符.关系运算符.逻辑运算符.位运算符. 算数运算符():+ - * / % ++ -- 关系运算符():== != > >= < <= 逻 ...
- Jira中的Tempo查看component以及issue的工作量汇总
在右侧group by的地方,同时选中component和issue
- MySQL定义数据库对象之指定definer
mysql创建view.trigger.function.procedure.event时都会定义一个Definer: SQL SECURITY 有两个选项,一个为DEFINER,一个为INVOKER ...
- ubuntu更换源
1.备份源 cd /etc/apt/ sudo cp sources.list sources.list.bak 2.更换阿里源 sudo vim /etc/apt/sources.list 中 ...
- jmeter之JDBC请求
jmeter不仅可以测试http请求,也可以执行JDBC请求的测试.本次以mysql为例,介绍JDBC请求如何完成发送 目录 1.环境配置 2.数据库连接配置 3.添加一个JDBC请求 1.环境配置 ...
- Python的Django框架中的URL配置与松耦合
Python的Django框架中的URL配置与松耦合 用 python 处理一个文本时,想要删除其中中某一行,常规的思路是先把文件读入内存,在内存中修改后再写入源文件. 但如果要处理一个很大的文本,比 ...
- HTML--JS 表单验证
<html> <head> <title>验证表单</title> <script type="text/javascript" ...
- CentOS安装ruby, Haskall,io语言
安装ruby yum install ruby irb rdoc 安装Haskall yum install ghc 安装io语言 安装io语言,需要先安装cmake不过不要使用yum来进行安装,yu ...
- BZOJ 3331 (Tarjan缩点+树上差分)
题面 传送门 分析 用Tarjan求出割点,对点-双连通分量(v-DCC)进行缩点,图会变成一棵树 注意v-DCC的缩点和e-DCC不同,因为一个割点可能属于多个v-DCC 设图中共有p个割点和t个v ...
- [暑假集训Day1T2]北极通讯网络
这题主要考察对“卫星电话”的理解,k个卫星电话相当于可以让k个联通块保持联通,因此我们只需要让原图连成k个联通块,然后给每个联通块的任意一个节点发一部卫星电话即可.因此我们需要连n-k条边,特别地,当 ...