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通道.软件单次触发) ...
随机推荐
- php的URL查询字符串解析函数
URL查询字符串格式:Data[650][BLN]=40002307312&Data[650][Status]=電聯無人接聽. 解析这种数据使用函数:parse_str(). parse_st ...
- Python笔记(十四)_永久存储pickle
pickle模块:将所有的Python对象转换成二进制文件存放 应用场景:编程时最好将大对象(列表.字典.集合等)用pickle写成永久数据包供程序调用,而不是直接写入程序 写入过程:将list转换为 ...
- poj2718Smallest Difference (穷竭搜索)
escription - 题目描述 给定若干位十进制数,你可以通过选择一个非空子集并以某种顺序构建一个数.剩余元素可以用相同规则构建第二个数.除非构造的数恰好为0,否则不能以0打头. 举例来说,给定数 ...
- 牛顿法求极值及其Python实现
最初对于牛顿法,我本人是一脸懵的.其基本原理来源于高中知识.在如下图所示的曲线,我们需要求的是f(x)的极值: 对于懵的原因,是忘记了高中所学的点斜式,直接贴一张高中数学讲义: 因为我们一路沿着x轴去 ...
- UI自动化处理文件上传
UI自动化处理文件上传 import win32guiimport win32con def set_uploader(self, file_path): sleep(2) self.file_pat ...
- Jenkins搭建,节点配置
一.服务器安装jdk和Jenkins 二.安装完成后打开jenkins页面:http://localhost:8080,设置管理员密码后登陆进去. 三.系统管理->全局变量,勾选允许用户注册 ...
- [Python3 填坑] 014 类的常用魔术方法举例
目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 __init__() 2.2 __new__() 2.3 __call__() 2.4 __str__() 2.5 __repr__() ...
- Python 学习笔记17 文本 - 读写
在我们的编程过程中,我们经常需要对文件进行读写操作. 在Python中,对文本的读写非常的方便,只需要简单的几行代码就可以实现. 我们首先新建一个文本文件"Text.txt", 里 ...
- java_第一年_JDBC(4)
注:该篇只是为了小白的我熟悉下JDBC的代码,练习篇 在mysql中建test测试库,并创建一张employees表,加入一些数据如下图: 通过JDBC连接对表中数据进行添加: package lzj ...
- mysql 5.7 事务隔离级别
事务的隔离级别分为:未提交读(read uncommitted).已提交读(read committed).可重复读(repeatable read).串行化(serializable). 未提交读: ...