同一算法的直方图均衡化cuda实现结果不正确,而C实现结果是正确的,为什么?

wenqingkaituozhe 2014-08-26 07:48:35
直方图均衡化的核函数如下,代码可以实现,算法也是对的,但结果却不正确,不知道是什么原因,很费解,希望有高手可以解答一下,谢谢!
__global__ void HistoGramEqualkernel(unsigned char* input_data,unsigned char* output_data, int*histOrg, int*histEqual,int width,int height)
{
int x = blockIdx.x * blockDim.x + threadIdx.x;
int y = blockIdx.y * blockDim.y + threadIdx.y;
if(x<width && y<height)
{

const unsigned int value=input_data[y*width+x];
atomicAdd(&(histOrg[value]),1);

}
__syncthreads();

float histAdd[256] = {0};//累计直方图
int grayVal[256] = {0};//变换后的灰度值
int notal = width*height;

//累计直方图信息

for (int i=0; i<256; i++)
{
if (i == 0)
{
histAdd[i] = histOrg[i];
}
else
{
histAdd[i] = histAdd[i-1] + histOrg[i];
}
float Val=(histAdd[i]/notal)*255;
grayVal[i] = (int)(Val+0.5);
}
//将变换后的灰度值反映到图像并统计均衡化后的直方图
if(x<width && y<height)
{
output_data[y*width+x] = grayVal[input_data[y*width+x]];

atomicAdd(&(histEqual[output_data[tid]]),1);
}
__syncthreads();
}


...全文
1226 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
JeneyWang 2016-10-13
  • 打赏
  • 举报
回复
请问楼主您的问题解决了吗?我现在正在学习cuda直方图均衡化,请问您的代码在哪里可以下载,或者可不可以把您的代码发我一份,我想学习一下~感谢感谢~(2679538986@qq.com)
wenqingkaituozhe 2014-10-20
  • 打赏
  • 举报
回复
关于这个问题已解决,我用两个核函数来做,一个负责统计并计算灰度映射表,另一个进行新灰度映射并赋值,应该是消除了i(0—256)的影响,这样做出来的结果是对的.
wenqingkaituozhe 2014-09-15
  • 打赏
  • 举报
回复
在计算累计直方图时是一个串行计算过程,并没有用到线程,加上同步__syncthreads()没有作用的,我也试了,确实无用,现在我有个疑问: 我将串行和并行的变换后的灰度值 grayVal[i] 输出,结果是一样的,说明这之前是对的,我输出output_data[i]时数据不同,说明在最后一步查找映射表错了,但是我不知道为什么? 即if(x<width && y<height) { output_data[y*width+x] = grayVal[input_data[y*width+x]]; atomicAdd(&(histEqual[output_data[tid]]),1); } 过程出错
随机过程 2014-09-12
  • 打赏
  • 举报
回复
直方图累加后,变换前还要进行同步
wenqingkaituozhe 2014-08-29
  • 打赏
  • 举报
回复
你讲的我也想过,线程设置如下: #define TILE_WIDTH 16 dim3 dimBlock( TILE_WIDTH, TILE_WIDTH); //线程块的维度 dim3 dimGrid((width+TILE_WIDTH-1)/ TILE_WIDTH, (height+TILE_WIDTH-1)/ TILE_WIDTH); //线程网格的维度 HistoGramEqualkernel<<< dimGrid, dimBlock >>>(Md,Nd,Or,Eq,width, height); //调用内核函数
adagio_chen 2014-08-29
  • 打赏
  • 举报
回复
结果大体上是对的,但是分成了16层。联想到256=16*16,你看看是不是设置grid和block错了
wenqingkaituozhe 2014-08-28
  • 打赏
  • 举报
回复
错误的结果就是帖子里程序后面附上的图像,正确结果如下图:
adagio_chen 2014-08-27
  • 打赏
  • 举报
回复
错误的结果是什么?
基于python的暗原色先验算法与AOD神经网络实现图像去雾源码+项目说明文档+实验报告+可执行程序.zip 【项目介绍】 该资源内项目代码都是经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶, 或者实际项目借鉴参考! 当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。如果基础还行,也可在此代码基础上进行修改,以实现其他功能。 图像去雾 本项目用暗原色先验算法和AOD神经网络实现图像去雾 暗原色先验 可执行程序 可程序程序带有UI用户界面,在Windows系统下打开“可执行程序\暗原色先验\dehaze.exe”来使用。 点击“选择图片”按钮选择要处理的图片,点击“去雾”按钮获得图像去雾结果,可选择对结果进行直方图均衡,可以调整结果图片的亮度。 代码 可以将测试图片放在testbench文件夹内,运行main.m,在results文件夹内查看结果。 - mygui.m: UI用户界面的代码 - main.m: 对同目录下“testbench”文件夹中的图片进行去雾,存储在results文件夹下。 - dehaze.m: 图像去雾主逻辑 - getA.m: 获得全局背景光。 - getA_ave.m: 获得全局背景光,使用平均值的方式。 - guidFilter.m: 快速引导滤波算法. - hist_equal.m: 对rgb分别进行rgb均衡 AOD神经网络 可执行程序 由于可执行程序太大(780M),所以上传至清华网盘 https://cloud.tsinghua.edu.cn/d/6be1526e6dfb4fc08e57/。 下载ui.exe和epoch11.pth,放在同一目录下,运行ui.exe 点击“选择图片”按钮选择要处理的图片,点击“去雾”按钮获得图像去雾结果,可选择对结果进行直方图均衡,可以调整结果图片的亮度。 代码 - ui.py: UI用户界面的代码。 - train.py: 训练网络所用代码。 - dataloader.py: 提取图片数据。 - utilis.py: 附加函数,如保存模型参数等。 - model.py: AOD模型。 - test.py: 载入模型参数并在给定图片上进行测试。 环境 - torch 1.2.0 - python 3.5.2 - Cuda compilation tools, release 10.1, V10.1.105 - cudnn 6 训练参数 - **FC_LR = 1e-4** (learning rate of fully-connected parameters) - **NET_LR = 1e-4** (learning rate of other parameters) - **BATCH_SIZE = 64** (training batch size) - **OPTIMIZER = 'adam'** (optimizer choice, adam or sgd) - **WEIGHT_DECAY = 1e-4** (weight decay, applied only when using SGD) - **MOMENTUM = 0.9** (momentum, applied only when using SGD) - **DECAY_RATE = 0.1** (decay rate of learning rate every 10 epoches) 训练方法 首先需要从https://sites.google.com/site/boyilics/website-builder/project-page下载训练数据集放在code文件夹同目录data文件夹内 data文件夹内应该由data文件夹(有雾图片)和images文件夹(原图) 在根目录下运行python code/train.py

579

社区成员

发帖
与我相关
我的任务
社区描述
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。
社区管理员
  • CUDA编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧