[16] 使用Opencv_CUDA 实现访问图像像素、直方图均衡化、几何变换

news2024/11/13 15:33:43

使用Opencv_CUDA 实现访问图像像素、直方图均衡化、几何变换

  • 访问图像的各个像素强度
  • 直方图的计算与均衡
  • 几何变换:缩放、平移与旋转

1. 访问图像的各个像素强度

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


int main()
{
	cv::Mat h_img1 = cv::imread("images/cameraman.tif", 0);
	cv::Scalar intensity = h_img1.at<uchar>(cv::Point(100, 50));
	std::cout << "Pixel Intensity of gray scale Image at (100,50) is:" << intensity.val[0] << std::endl;
	cv::Mat h_img2 = cv::imread("images/autumn.tif", 1);
	cv::Vec3b intensity1 = h_img2.at<cv::Vec3b>(cv::Point(100, 50));
	std::cout << "Pixel Intensity of color Image at (100,50) is:" << intensity1 << std::endl;
	return 0;
}

在这里插入图片描述

2. 直方图计算与均衡

  • 直方图时图像的一个非常重要的属性,提供了图像外观的全局描述
  • 通常直方图均匀分布,可以得到较好的视觉效果
  • 对灰度图实现均衡化:
#include <iostream>
#include "opencv2/opencv.hpp"
#include<cudaimgproc.hpp>


int main()
{
    cv::Mat h_img1 = cv::imread("images/cameraman.tif", 0);
    cv::cuda::GpuMat d_img1, d_result1;
    d_img1.upload(h_img1);
    cv::cuda::equalizeHist(d_img1, d_result1);
    cv::Mat h_result1;
    d_result1.download(h_result1);
    cv::imshow("Original Image ", h_img1);
    cv::imshow("Histogram Equalized Image", h_result1);
    cv::imwrite("images/result_inversion.png", h_img1);
    cv::imwrite("images/result_inversion.png", h_result1);
    cv::waitKey();
    return 0;
}

在这里插入图片描述

  • 对三通道彩色图实现均衡化:
#include <iostream>
#include "opencv2/opencv.hpp"


int main()
{
    cv::Mat h_img1 = cv::imread("images/autumn.tif");
    cv::Mat h_img2, h_result1;
    cvtColor(h_img1, h_img2, cv::COLOR_BGR2HSV);
    //Split the image into 3 channels; H, S and V channels respectively and store it in a std::vector
    std::vector< cv::Mat > vec_channels;
    cv::split(h_img2, vec_channels);
    //Equalize the histogram of only the V channel 
    cv::equalizeHist(vec_channels[2], vec_channels[2]);
    //Merge 3 channels in the vector to form the color image in HSV color space.
    cv::merge(vec_channels, h_img2);

    //Convert the histogram equalized image from HSV to BGR color space again
    cv::cvtColor(h_img2, h_result1, cv::COLOR_HSV2BGR);
    cv::imshow("Original Image ", h_img1);
    cv::imshow("Histogram Equalized Image", h_result1);
    cv::waitKey();
    return 0;
}

在这里插入图片描述

3. 几何变换

  • 图像缩放:
#include <iostream>
#include "opencv2/opencv.hpp"
#include<opencv2/cudawarping.hpp>

int main()
{
    cv::Mat h_img1 = cv::imread("images/cameraman.tif", 0);
    cv::cuda::GpuMat d_img1, d_result1, d_result2;
    d_img1.upload(h_img1);
    int width = d_img1.cols;
    int height = d_img1.size().height;
    cv::cuda::resize(d_img1, d_result1, cv::Size(200, 200), cv::INTER_CUBIC);
    cv::cuda::resize(d_img1, d_result2, cv::Size(0.5 * width, 0.5 * height), cv::INTER_LINEAR);
    cv::Mat h_result1, h_result2;
    d_result1.download(h_result1);
    d_result2.download(h_result2);
    cv::imshow("Original Image ", h_img1);
    cv::imshow("Resized Image", h_result1);
    cv::imshow("Resized Image 2", h_result2);
    cv::imwrite("Resized1.png", h_result1);
    cv::imwrite("Resized2.png", h_result2);
    cv::waitKey();
    return 0;
}

在这里插入图片描述

  • 图像平移与旋转
#include <iostream>
#include "opencv2/opencv.hpp"
#include<opencv2/cudawarping.hpp>

int main()
{
	cv::Mat h_img1 = cv::imread("images/cameraman.tif", 0);
	cv::cuda::GpuMat d_img1, d_result1, d_result2;
	d_img1.upload(h_img1);
	int cols = d_img1.cols;
	int rows = d_img1.size().height;
	//Translation
	cv::Mat trans_mat = (cv::Mat_<double>(2, 3) << 1, 0, 70, 0, 1, 50);
	cv::cuda::warpAffine(d_img1, d_result1, trans_mat, d_img1.size());
	//Rotation
	cv::Point2f pt(d_img1.cols / 2., d_img1.rows / 2.);
	cv::Mat r = cv::getRotationMatrix2D(pt, 45, 1.0);
	cv::cuda::warpAffine(d_img1, d_result2, r, cv::Size(d_img1.cols, d_img1.rows));
	cv::Mat h_result1, h_result2;
	d_result1.download(h_result1);
	d_result2.download(h_result2);
	cv::imshow("Original Image ", h_img1);
	cv::imshow("Translated Image", h_result1);
	cv::imshow("Rotated Image", h_result2);
	cv::imwrite("Translated.png", h_result1);
	cv::imwrite("Rotated.png", h_result2);
	cv::waitKey();
	return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1840061.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

调取Windows系统虚拟键盘

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 using System.Diagnostics;namespace 调取Windows虚拟键盘 {public partial class Form1 : Form{public Form1(){InitializeComponent();}private void richTextBox1_DoubleClick(object sender, EventArgs e){Proces…

对于补码的个人理解

1. 十进制的取模计算 现在我想要使另一个数加上2后用8取模后也等于1&#xff0c;这个数可以是哪些&#xff1f; 这个问题比较简单&#xff0c;只需要-1加上8的倍数即可 例如&#xff1a; 如果我们想要得到距离-1这个负数最近的一个正数7&#xff0c;直接使用-18即可。反过来想…

JavaSE 面向对象程序设计高级 方法引用 2024详解

在编程中&#xff0c;方法引用&#xff08;Method Reference&#xff09;是一种技术&#xff0c;它让你能够直接引用一个现有的函数或方法&#xff0c;而无需通过对象实例来调用。这种方法在函数式编程和高阶函数中非常有用&#xff0c;因为它提供了简洁的方式来传递函数行为&a…

晋升受阻或遭受不公:你想到这条路了吗?

晋升受阻或遭受不公&#xff1a;你想到这条路了吗&#xff1f; 当你在职场上遇到晋升受阻或者感觉受到不公平对待的时候&#xff0c;你一般选择怎么处理&#xff1f;是逆来顺受、忍气吞声、还是听命安排与据理力争&#xff1f; 其实并非无路可走&#xff0c;这时候&#xff0c;…

在二维空间中用椭圆表示不确定性

在二维空间中用椭圆表示不确定性 flyfish import numpy as np import matplotlib.pyplot as plt from matplotlib.patches import Ellipse# 生成示例数据 np.random.seed(0) data np.random.multivariate_normal([0, 0], [[4, 2], [2, 3]], size500)# 计算均值和协方差矩阵 …

使用node把任意网站封装为可执行文件

直接上步骤&#xff1a; 1. node.js 环境准备 下载地址 那个版本都行&#xff0c;下一步->下一步 安装即可 2. windows 系统下&#xff0c; 快捷键 winr ->输入 cmd -> 回车 3. 执行第一个命令&#xff0c;安装 nativefier 等一段时间 npm install nativefier -g 4…

GitHub爆赞!最适合新手入门的教程——笨方法学Python 3

“Python 是一门既容易上手又强大的编程语言。”这句话本身并无大碍&#xff0c;但需要注意的是&#xff0c;正因为它既好学又好用&#xff0c;所以很多 Python 程序员只用到了其强大功能的一小部分。 今天给小伙伴们分享的这份手册以习题的方式引导读者一步一步学习编程&…

VMware 虚拟机共享宿主机文件夹

一、背景 在虚拟机中&#xff0c;需要写文件到宿主机的文件系统中 宿主机的文件共享给虚拟机使用 这些场景就涉及到VM的虚拟机怎么访问宿主机的磁盘文件夹 二、软件背景 宿主机&#xff1a;window机器&#xff0c;本文是win7 虚拟软件&#xff1a;VMware12.5.6&#xff0…

js文件导出功能

效果图&#xff1a; 代码示例&#xff1a; <!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"><title>html 表格导出道</title><script src"js/jquery-3.6.3.js"></script><st…

Office--加载宏-CS上线

免责声明:本文仅做技术交流与学习... 目录 关于宏上线的格式: 操作流程: 其他office文本的上线格式一样: 关于宏上线的格式: doc宏病毒: 1-生成格式为dotm 只要点启用宏就上线 2-生成格式为()word 97-2003 .doc) 被杀 操作流…

Qt入门小项目 | 实现一个图片查看器

文章目录 一、实现一个图片查看软件 一、实现一个图片查看软件 需要实现的功能&#xff1a; 打开目录选择图片显示图片的名字显示图片 在以上功能的基础上进行优化&#xff0c;需要解决如下问题&#xff1a; 如何记住上次打开的路径&#xff1f; 将路径保存到配置文件中&#x…

LabVIEW在SpaceX的应用

结合真实的资料介绍LabVIEW在SpaceX的应用&#xff0c;涵盖自动化测试系统、数据采集与监控、可视化与分析、模块化设计与扩展&#xff0c;以及效率与可靠性的提高。 ​ 自动化测试系统 LabVIEW在SpaceX的自动化测试系统中发挥了关键作用。自动化测试是确保SpaceX火箭及其子系…

Android焦点机制结合WMS

文章前提&#xff1a; 了解WMS基本作用了解window的概念&#xff0c;phoneWindow&#xff0c;rootViewImpl了解view的事件分发 开始&#xff1a; 讲三件事情&#xff1a; window的创建&#xff0c;更新焦点的更新事件的分发 Window的创建&#xff0c;更新&#xff1a; wi…

IT入门知识第二部分《编程语言》(2/10)

目录 IT入门知识博客文章大纲第二部分《编程语言》 1.引言 2.编程语言概述 2.1 编程语言的发展历程 2.2 编程范式 3.常见的编程语言 3.1 Python 3.2 Java 3.3 C 3.4 JavaScript 3.5 Ruby 4.编程语言的选择 4.1 技术需求 4.2 团队技能 4.3 社区和生态系统 4.4 可…

经验分享,CRC(循环冗余校验)在线计算

这里分享一个好用的在线计算CRC的网站。 网址&#xff1a;http://www.ip33.com/crc.html 截图&#xff1a;

Linux - 进程

一、什么是进程 首先&#xff0c;Linux是一个多用户多进程的操作系统&#xff0c;系统上可以同时运行多个进程。 进程的产生&#xff1a;①是在执行程序或者命令时产生的&#xff1b;②定时任务进程 进程的类型&#xff1a;前台进程/后台进程 前台进程&#xff1a;一个终端…

之所以选择天津工业大学,因为它是双一流、报考难度适宜,性价比高!天津工业大学计算机考研考情分析!

天津工业大学&#xff08;Tiangong University&#xff09;&#xff0c;简称“天工大”&#xff0c;位于天津市&#xff0c;是教育部与天津市共建高校、国家国防科技工业局和天津市共建的天津市重点建设高校、国家“双一流”建设高校、天津市高水平特色大学建设高校、中国研究生…

[Linux] 其他命令

cat cat是用法极多的一个命令&#xff1a; 1.输入输出 如果不加任何修饰&#xff0c;只一个cat&#xff0c;它是&#xff1a; 标准输入设备&#xff08;键盘&#xff09;——》标准输出设备&#xff08;显示器&#xff09; 显示文件内容&#xff1a; cat filename 输入重定向&a…

从0开始C++(二):类、对象、封装

目录 类&对象的概念 类的内容 对象的创建 ● 栈内存对象 ● 堆内存对象 封装 类&对象的概念 类和对象是一个比较抽象的概念&#xff0c;这里直接用一个实例方便理解。 类&#xff1a;类是一个抽象的概念&#xff0c;用来描述同一类对象的特点&#xff08;比如&am…

深圳中小企业融资攻略,贷款方法大盘点!

中小企业融资这事&#xff0c;可不是一个简单的事情。资金对中小企业来说&#xff0c;就像血液对人体一样重要。企业发展离不开资金支持&#xff0c;特别是在今年这个环境下&#xff0c;政策对中小企业还挺友好的。今天讲解一下中小微企业常用的几种贷款方法。希望能让大家更明…