OpenCV-C++-CUDA-03-图像直方图及几何变换

        本章主要内容有图像的直方图计算、直方图均衡化、图像大小变换及旋转(当然了,基于CUDA)。

一、直方图计算

OpenCV GPU版本计算直方图的时候只能是单通道(这点跟CPU版本不一样),那么如果是多通道怎么办呢,一个一个计算呗。

主要API:

cuda::split() //通道分离
cuda::calcHist() //计算直方图

#include<opencv2/opencv.hpp>
#include<opencv2/cudaimgproc.hpp>
#include<iostream>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	Mat input_image = imread("F:/test/lena.jpg");
	if (input_image.empty())
	{
		cout << "the image is not exist..." << endl;
		return -1;
	}
	cuda::GpuMat image(input_image),hist;
	/*-----直方图计算------*/
	vector<cuda::GpuMat>mv; 
	cuda::split(image, mv);//通道分离
	cuda::calcHist(mv[2], hist);
	Mat hist_host;
	hist.download(hist_host);
	for (int i = 0; i < hist_host.cols; i++)
	{
		int pv = hist_host.at<int>(0, i);
		cout << "个数:" << pv << " " << "像素值" << i << endl;
	}
	return 0;

}

打印结果:
在这里插入图片描述
有了这个东西,就可以绘制直方图。

二、直方图均衡化

        直方图均衡化比较受限的一点是,它只支持单通,不支持多通道,所以依旧要通道分离,但是这个通道分离不是分离BGR,而是分离HSV,其中的“V”代表了亮度,我们就是要对V通道进行均衡化。
主要有以下步骤:

1)BGR转HSV;
2)分离HSV中的V通道;
3)对V通道做直方图均衡化;
4)混合HSV(V是均衡化后的结果);
5)HSV转BGR。

代码:

/*-----直方图均衡化-----*/
	//转成HSV通道
	cuda::GpuMat hsv;
	cuda::cvtColor(image, hsv, COLOR_BGR2HSV);
	vector<cuda::GpuMat>eq_mv;
	cuda::split(hsv, eq_mv);//通道分离
	cuda::equalizeHist(eq_mv[2], eq_mv[2]);//直方图均衡化
	cuda::merge(eq_mv, hsv);//重新混合所有通道
	cuda::cvtColor(hsv, hsv, COLOR_HSV2BGR);//把HSV转回BGR
	Mat hsv_host;
	hsv.download(hsv_host);
	imshow("input image", input_image);
	imshow("eq-hist", hsv_host);
	waitKey(0);

结果:
在这里插入图片描述

三、图像Resize和旋转

        这个操作跟OpenCV CPU版的其实没什么两样,会的人自然懂,不会的人需要学一下CPU版的,下面直接上代码:
1)resize:

cuda::GpuMat dst;
	Mat resize_dst;
	cuda::resize(image, dst, Size(0, 0), 1.2, 1.2,INTER_CUBIC);//resize
	dst.download(resize_dst);
	imshow("resize image", resize_dst);
	waitKey(0);

结果:
在这里插入图片描述
2)旋转:

cuda::GpuMat rota;
	Mat rota_host;
	int center_x = input_image.rows / 2;
	int center_y = input_image.cols / 2;

	Mat M = getRotationMatrix2D(Point(center_x, center_y), 45, 1.0);
	cuda::warpAffine(image, rota, M, image.size());
	rota.download(rota_host);
	imshow("rota image", rota_host);
	waitKey(0);

结果:
在这里插入图片描述
        可以看到,确实是变换了吧,其实,本章的所有内容都是可以用在图像增强里面的,也主要是为了深度学习打下一个基础。

下面附上所有代码:

#include<opencv2/opencv.hpp>
#include<opencv2/cudaimgproc.hpp>
#include<iostream>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	Mat input_image = imread("F:/test/lena.jpg");
	if (input_image.empty())
	{
		cout << "the image is not exist..." << endl;
		return -1;
	}
	cuda::GpuMat image(input_image),hist;
	/*-----直方图计算------*/
	vector<cuda::GpuMat>mv; 
	cuda::split(image, mv);//通道分离
	cuda::calcHist(mv[2], hist);
	Mat hist_host;
	hist.download(hist_host);
	for (int i = 0; i < hist_host.cols; i++)
	{
		int pv = hist_host.at<int>(0, i);
		cout << "个数:" << pv << " " << "像素值" << i << endl;
	}

	/*-----直方图均衡化-----*/
	//转成HSV通道
	cuda::GpuMat hsv;
	cuda::cvtColor(image, hsv, COLOR_BGR2HSV);
	vector<cuda::GpuMat>eq_mv;
	cuda::split(hsv, eq_mv);//通道分离
	cuda::equalizeHist(eq_mv[2], eq_mv[2]);//直方图均衡化
	cuda::merge(eq_mv, hsv);//重新混合所有通道
	cuda::cvtColor(hsv, hsv, COLOR_HSV2BGR);//把HSV转回BGR
	Mat hsv_host;
	hsv.download(hsv_host);
	imshow("input image", input_image);
	imshow("eq-hist", hsv_host);
	/*-----图像resize-----*/
	cuda::GpuMat dst;
	Mat resize_dst;
	cuda::resize(image, dst, Size(0, 0), 1.2, 1.2,INTER_CUBIC);//resize
	dst.download(resize_dst);
	imshow("resize image", resize_dst);
	/*-----图像旋转-----*/
	cuda::GpuMat rota;
	Mat rota_host;
	int center_x = input_image.rows / 2;
	int center_y = input_image.cols / 2;

	Mat M = getRotationMatrix2D(Point(center_x, center_y), 45, 1.0);
	cuda::warpAffine(image, rota, M, image.size());
	rota.download(rota_host);
	imshow("rota image", rota_host);
	waitKey(0);
	return 0;

}
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Opencv-python图像变换是通过使用不同的变换矩阵来实现的。其中,平移是一种最简单的空间变换。使用Opencv的函数cv2.warpAffine()可以实现平移操作。在代码中,我们需要定义一个变换矩阵M,这个矩阵是一个2行3列的矩阵,决定了平移的方式。其中,M矩阵中的tx和ty分别表示在x和y方向上平移的距离。更具体地说,如果我们向右平移tx个像素,向下平移ty个像素,那么变换矩阵M的定义如下: import numpy as np rows, cols = img.shape[:2] M = np.float32([[1, 0, tx], [0, 1, ty]]) dst = cv2.warpAffine(img, M, (cols, rows)) 在上述代码中,我们使用了NumPy库来创建一个2x3的浮点型变换矩阵M,并将其传递给cv2.warpAffine()函数,该函数会将图像img按照定义的方式进行平移,并生成一个新的图像dst。最后,我们可以通过cv2.imshow()函数显示平移后的图像。 除了平移之外,Opencv还提供了其他的图像变换操作,比如缩放。缩放可以按照指定的宽度和高度来调整图像的大小,也可以按照比例来进行缩放。通过cv2.resize()函数可以实现缩放操作。在代码中,我们可以使用下面的方式来进行缩放操作: import cv2 img = cv2.imread('drawing.jpg') # 按照指定的宽度、高度缩放图片 res = cv2.resize(img, (width, height)) # 按照比例缩放图片 res2 = cv2.resize(img, None, fx=scale_x, fy=scale_y, interpolation=cv2.INTER_LINEAR) 在上面的代码中,我们首先使用cv2.imread()函数读取图像,并将其存储在变量img中。然后,我们可以使用cv2.resize()函数来调整图像的大小。其中,如果我们指定了宽度和高度,那么图像将按照这些指定的大小进行缩放;如果我们指定了fx和fy的比例因子,那么图像将按照这些比例进行缩放。最后,我们可以使用cv2.imshow()函数来显示缩放后的图像。 总结起来,Opencv-python提供了多种图像变换操作,包括平移、缩放等。通过使用相应的函数和变换矩阵,我们可以实现对图像的各种变换操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [opencv-python 详解图像几何变换缩放、平移、旋转、翻转](https://blog.csdn.net/RayChiu757374816/article/details/120036004)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值