C++ 彩色图像(RGB)三通道直方图计算和绘制,图像逆时针旋转90° 实现代码

时间:2022-08-22 20:42:41
 #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° 实现代码的更多相关文章

  1. 多通道&lpar;比方RGB三通道&rpar;卷积过程

    今天一个同学问 卷积过程好像是对 一个通道的图像进行卷积, 比方10个卷积核,得到10个feature map, 那么输入图像为RGB三个通道呢,输出就为 30个feature map 吗, 答案肯定 ...

  2. opencv —— calcHist、minMaxLoc 计算并绘制图像直方图、寻找图像全局最大最小值

    直方图概述 简单来说,直方图就是对数据进行统计的一种方法,这些数据可以是梯度.方向.色彩或任何其他特征.它的表现形式是一种二维统计表,横纵坐标分别是统计样本和该样本对应的某个属性的度量. 计算直方图: ...

  3. OpenCV——RGB三通道分离

    opencv 和 matlab 在处理彩色图像的时候,通道的存储顺序是不同的. matlab 的排列顺序是R,G,B: 而在opencv中,排列顺序是B,G,R. 下面通过一个小程序看看opencv中 ...

  4. OpenCV绘制图像中RGB三个通道的直方图

    一开始是看<OpenCV计算机视觉编程攻略(第2版)>这本书学做直方图,但是书本里说直方图的部分只详细说了黑白图像(单通道)的直方图绘制方法,RGB图像的直方图只说了如何计算,没有说计算完 ...

  5. OpenCV 学习笔记(8)彩色图像RGB通道的分离、合并与显示

    https://blog.csdn.net/ZYTTAE/article/details/42234989 由于算法的需要,需要把彩色图像的R.G.B值分离出来,OpenCV中正好有split() 和 ...

  6. 纯Python综合图像处理小工具(1)分通道直方图

    平时工作经常需要做些图像分析,需要给图像分通道,计算各个通道的直方图分布特点,这个事儿photoshop也能做,但是用起来不方便,且需要电脑上安装有PS软件,如果用OpenCV, 更是需要在visua ...

  7. Halcon一日一练:创建三通道图像

    首先理解一个什么是三通道图像: 三通道图像就是彩色图像,我们之前黑白相机或黑白电视机都是彩用的灰阶图像,即单通道图像,一般是2的8次方个灰阶,即256个灰阶.彩色图像采用RGB,红绿蓝三个通道来合成彩 ...

  8. Halcon学习之三:有关图像通道的函数(R是三通道,B是1通道,G二通道),排列顺序BGR

    黑白摄像机会返回每个像素所对应的能量采用结果,这些结果组成了一幅单通道灰度值图像,而对于RGB彩色摄像机,它将返回每个像素所对应的三个采样结果,也就是一幅三通道图像.下面这些是与图像通道有关的函数: ...

  9. STM32F10x&lowbar;ADC三通道DMA连续转换&lpar;3通道、软件单次触发&rpar;

    Ⅰ.概述 上一篇文章讲述的内容是:三通道逐次转换(单次.单通道软件触发),也就是说3条通道要三次软件触发才能完成转换,而且是通过软件读取转换数值. 本文讲述三通道DMA连续转换(3通道.软件单次触发) ...

随机推荐

  1. 自定义WM&lowbar;NOTIFY消息

    自定义WM_NOTIFY消息 习惯了用自定义用户消息进行各种状态的通知,特别是子窗口与父窗口之间的交互.但ON_MESSAGE没有控件ID的限制,如果有多个子窗口发送同一个消息给父窗口时,父窗口就不知 ...

  2. JS拖动div的原理

    要实现移动窗体,首先要捕获三个参数:1.a = 鼠标点击时的坐标.2.b = 被移动窗体的左顶点坐标.3.c = 鼠标移动时的坐标.然后还要算出你鼠标无论点击窗体哪个位置,移动改变的都是 (d = 窗 ...

  3. iframe的一些简单记录

    //获取当前所在IFrame的id var frameId = window.frameElement && window.frameElement.id || ''; //Jquer ...

  4. Github朝花夕拾

    删除fork的项目   下载指定revision的repository 通过git log查看提交历史,最好是GUI查看 然后执行命令git reset –hard <sha1> 同步到最 ...

  5. &lbrack;C&num; 基础知识系列&rsqb;专题三:如何用委托包装多个方法——委托链 (转载)

    引言: 上一专题介绍了下编译器是如何来翻译委托的,从中间语言的角度去看委托,希望可以帮助大家进一步的理解委托,然而之前的介绍都是委托只是封装一个方法,那委托能不能封装多个方法呢?因为生活中经常会听到, ...

  6. Spring再接触 简单属性注入

    <bean name="userDAO" class="com.bjsxt.dao.impl.UserDAOImpl"> <property ...

  7. vue从入门到进阶:计算属性computed与侦听器watch(三)

    计算属性computed 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div id="example" ...

  8. 搭建LNMP环境(CentOS 6)

    本文档介绍如何使用一台普通配置的云服务器ECS实例搭建LNMP平台的web环境. Linux:*和开放源码的类UNIX操作系统. Nginx:轻量级网页服务器.反向代理服务器. MySQL:关系型数 ...

  9. Vue加载json文件

    一.在build/dev-server.js文件里 var app = express() 这句代码后面添加如下(旧版): var appData = require('../address.json ...

  10. Appium之uiautomator定位元素

    元素定位方式有多种,Android也有自身独有的定位方式.下面就单独介绍其基于uiautomator定位元素的方法: 基本语法: driver.find_element_by_android_uiau ...