对于图像灰度化,使用了opencv-cuda实现与完全基于cuda实现,本程序中参考了网上多个教程,主要记录和学习的过程。

目录

1、opencv+cuda实现图像灰度化

2、CUDA实现图像灰度化

3、图像展示

3.1 opencv+cuda

3.2 cuda


1、opencv+cuda实现图像灰度化

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/cudaarithm.hpp>
#include <opencv2/cudafeatures2d.hpp>
#include <opencv2/cudev.hpp>
#include <opencv2/cudabgsegm.hpp>
#include <opencv2/cudacodec.hpp>
#include <opencv2/cudafilters.hpp>
#include <opencv2/cudaimgproc.hpp>
#include <opencv2/cudalegacy.hpp>
#include <opencv2/cudaobjdetect.hpp>
#include <opencv2/cudaoptflow.hpp>
#include <opencv2/cudastereo.hpp>
#include <opencv2/cudawarping.hpp>int main() {cv::Mat img1 = cv::imread("H:\\opencv_project\\opencv_cuda学习\\image\\hist_02.jpg");cv::Mat img3;cv::cuda::GpuMat cuda_img1, cuda_img2, cuda_img3;cuda_img1.upload(img1);cv::cuda::cvtColor(cuda_img1,cuda_img3,cv::COLOR_BGR2GRAY);cuda_img3.download(img3);cv::namedWindow("cuda_gpu", cv::WINDOW_NORMAL);cv::imshow("cuda_gpu", img3);cv::waitKey(0);====================================================return 0;}

opencv中实现图像灰度化跟之前写法几乎一样,不同的就是数据从cpu拷贝到gup上这个操作,剩下的都差不读。

2、CUDA实现图像灰度化

cuda里面实现图像灰度化需要介绍很多东西了,比如__global__函数

grid、block、thread、。。。

针对程序里面出现的一些名词,给与我自己的理解。

1、uchar3对应的CV_8UC3即三通道图像

2、unsigned char ---CV_8UC1(目前我知道)

3、核 kernel

CUDA执行流程中最重要的一个过程是调用CUDA的核函数来执行并行计算,kernel是CUDA中一个重要的概念。在CUDA程序构架中,主机端代码部分在CPU上执行,是普通的C代码;当遇到数据并行处理的部分,CUDA 就会将程序编译成GPU能执行的程序,并传送到GPU,这个程序在CUDA里称做核(kernel)。设备端代码部分在GPU上执行,此代码部分在kernel上编写(.cu文件)。kernel用__global__符号声明,在调用时需要用<<<grid, block>>>来指定kernel要执行及结构。

4、CUDA是通过函数类型限定词区别在host和device上的函数,主要的三个函数类型限定词如下:

global:在device上执行,从host中调用(一些特定的GPU也可以从device上调用),返回类型必须是void,不支持可变参数参数,不能成为类成员函数。注意用__global__定义的kernel是异步的,这意味着host不会等待kernel执行完就执行下一步。

device:在device上执行,单仅可以从device中调用,不可以和__global__同时用。

host:在host上执行,仅可以从host上调用,一般省略不写,不可以和__global__同时用,但可和__device__同时使用,此时函数会在device和host都编译。

网格 grid

kernel在device上执行时,实际上是启动很多线程,一个kernel所启动的所有线程称为一个网格(grid),同一个网格上的线程共享相同的全局内存空间。grid是线程结构的第一层次。

线程块 block

网格又可以分为很多线程块(block),一个block里面包含很多线程。各block是并行执行的,block间无法通信,也没有执行顺序。block的数量限制为不超过65535(硬件限制)。第二层次。

grid和block都是定义为dim3类型的变量,dim3可以看成是包含三个无符号整数(x,y,z)成员的结构体变量,在定义时,缺省值初始化为1。grid和block可以灵活地定义为1-dim,2-dim以及3-dim结构。

5、 dim3 grid2((imgWidth + block2.x - 1) / block2.x, (imgHeight + block2.y - 1) / block2.y);这其中为什么需要减1,这是因为最大快能有1024个线程,对于N个线程来说,每个块有512的线程,则需要N/512个块,但是如果N不是512的整数倍,那么N除以512会得到一个错误的块数量,比实际需要的少一块,所以减去1再除以num,实际上就是一个除法向上取整的操作

#include "cuda_check.h"
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <opencv2/cudaarithm.hpp>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <cuda.h>
#include <device_functions.h>//=================CUDA实现图像灰度化====================
__global__ void BGR2GRAYincuda(uchar3* const d_in, unsigned char* const d_out,uint imgheight, uint imgwidth)
{const unsigned int idx = blockIdx.x * blockDim.x + threadIdx.x;const unsigned int idy = blockIdx.y * blockDim.y + threadIdx.y;if (idx < imgwidth && idy < imgheight){uchar3 rgb = d_in[idy * imgwidth + idx];d_out[idy * imgwidth + idx] = 0.299f * rgb.x + 0.587f * rgb.y + 0.114f * rgb.z;}
}int main()
{cv::Mat img1 = cv::imread("H:\\opencv_project\\opencv_cuda学习\\image\\hist_02.jpg");int imgHeight = img1.rows;int imgWidth = img1.cols;int length = imgWidth * imgHeight;//============CUDA实现后的传回的图像=======cv::Mat grayImg(imgHeight, imgWidth, CV_8UC1, cv::Scalar(255)); //==============创建GPU内存============uchar3* d_in1;unsigned char* d_out;CUDA_CHECK(cudaMalloc((void**)&d_in1, imgHeight * imgWidth * sizeof(char3)));CUDA_CHECK(cudaMalloc((void**)&d_out, imgHeight * imgWidth * sizeof(unsigned char)));//===========将图像从CPU传入GPU========CUDA_CHECK(cudaMemcpy(d_in1, img1.data, imgHeight * imgWidth * sizeof(char3), cudaMemcpyHostToDevice));//===========3维网格和3维线程块===========dim3 grid(1 + (length / (32 * 32 + 1)), 1, 1);      // griddim3 block(32, 32, 1);//=========使用2维网格和2维的线程块========dim3 block2(16, 16);dim3 grid2((imgWidth + block2.x - 1) / block2.x, (imgHeight + block2.y - 1) / block2.y);//调用核函数BGR2GRAYincuda << <grid2, block2 >> > (d_in1, d_out, imgHeight, imgWidth);CUDA_CHECK(cudaMemcpy(grayImg.data, d_out, imgHeight * imgWidth * sizeof(unsigned char), cudaMemcpyDeviceToHost));//释放GPU内存cudaFree(d_in1);cudaFree(d_out);cv::namedWindow("mm",cv::WINDOW_NORMAL);cv::imshow("mm", grayImg);cv::waitKey(0);return 0;
}

3、图像展示

3.1 opencv+cuda

3.2 cuda

OpenCV+CUDA学习2---图像灰度化相关推荐

  1. [Python图像处理] 十四.基于OpenCV和像素处理的图像灰度化处理

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  2. CUDA精进之路(三):图像处理——图像灰度化、灰度直方图统计

    引言 在大部分的图像处理程序中,其中必不可少的一步就是对传入的彩图进行灰度处理,将三个通道的RGB图片转化为单通道的Gray图,而对于灰度图进行直方图统计同样是观察检测图像特征的常用方法.在OpenC ...

  3. Opencv读取文件夹连续图片,RGB分量显示,图像灰度化

    1.读取文件夹连续图片 刚开始学习图像处理,开始只能一次读入一张图片,今天从网上查了一些资料,自己写了一个可以连续读取多张图片函数. char filename[100];char windownam ...

  4. 2种图像增强方法:图像点运算和图像灰度化处理

    摘要:本文主要讲解图像点运算的灰度化处理,详细介绍常用的灰度化处理方法,并分享了图像颜色空间相互转换,以及三种灰度转换算法的实现. 本文分享自华为云社区<[Python从零到壹] 四十三.图像增 ...

  5. 图像灰度化的三种方法(matlab、C++、Python实现)

    灰度化处理就是将一幅色彩图像转化为灰度图像的过程.彩色图像分为R,G,B三个分量,分别显示出红绿蓝等各种颜色,灰度化就是使彩色的R,G,B分量相等的过程.灰度值大的像素点比较亮(像素值最大为255,为 ...

  6. 图像灰度化的常用三种方式及其实现

    第一次写blog,还请各位同仁多多指正,万分感谢! 图像灰度化的常用三种方法有: 1.分量法(本文以B通道为例):将彩×××像的R.G.B三分量的亮度之一作为灰度图像灰度值 Gray=B or Gra ...

  7. html5图片灰度显示,HTML5 组件Canvas实现图像灰度化

    HTML5发布已经有很长一段时间了,一直以来从来没有仔细的看过,过年刚来随便看看 发现HTML5中的Canvas组件功能是如此的强大,不怪很多牛人预言Flash已死,死不死 不是我要关心的,我关心的C ...

  8. c#图像灰度化、灰度反转、二值化

    图像灰度化: 将彩色图像转化成为灰度图像的过程成为图像的灰度化处理.彩色图像中的每个像素的颜色有R.G.B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万(255*255*2 ...

  9. MATLAB:虹膜识别的图像灰度化处理,直方图均衡化

    (1)图像灰度化处理: 读取一张图片之后,进行灰度化处理,然后对其进行直方图均值化. clear;close all %读取原图地址 RGB= imread('D:\img\1.jpg'); %图像灰 ...

最新文章

  1. 7-17 爬动的蠕虫 (C语言)
  2. display none 隐藏后怎么显示_web前端入门到实战:元素显示隐藏的9种思路
  3. Java连接Elasticsearch6.xxx 环境测试篇一
  4. ThinkPHP文件上传
  5. [asp.net] 验证控件的属性及用法
  6. 简说设计模式——组合模式
  7. svn删除文件或目录后提交失败及解决
  8. 六轴UR机械臂标准DH正逆运动学公式推导+代码验证C++
  9. 淘客app开发成本要多少
  10. 02_泰坦尼克号幸存者分析(上)
  11. 独立开发的基于springboot + websocket IM网站聊天系统总结
  12. Adobe XMP SDK项目应用(续2)
  13. Android实现手机内存存储功能
  14. CocosCreator之微信小游戏的抽奖转盘
  15. 1 制作一个表格html表格,学术论文表格制作速成!
  16. pip安装模块时换源下载
  17. 函授计算机基础知识考试试题,2020年函授本科计算机应用基础课后作业、模拟题及答案.doc...
  18. 安卓效率微商_机友大师app-机友大师 安卓版v2.3.4-pc6手机下载
  19. 手撕Git,告别盲目记忆
  20. 问题测试数据NYOJ 478 月老的难题 (1)解题报告

热门文章

  1. 零食很忙:家门口的零食集合店,凭什么遍地生花?
  2. 计算机毕业设计Java家电仓储管理系统(源码+系统+mysql数据库+lw文档)
  3. 【Kafka】MM2同步Kafka集群时如何自定义复制策略(ReplicationPolicy)
  4. 【Redis】Redis4.0、5.0、6.0版本特性整理
  5. 互联网与神经学的交叉对比研究
  6. 使用tinyxml2.h读取xml文件并匹配文件中的值
  7. 【openEuler系列】部署文件共享服务Samba
  8. 《Dokcer的使用》(三) 镜像仓库和镜像
  9. [Vmware15]虚拟机中VMware Tools选项变成灰色怎么办
  10. 暗黑世界1.4客户端+1.6服务器在Mac系统下的搭建步骤