同一算法的直方图均衡化cuda实现结果不正确,而C实现结果是正确的,为什么?
直方图均衡化的核函数如下,代码可以实现,算法也是对的,但结果却不正确,不知道是什么原因,很费解,希望有高手可以解答一下,谢谢!
__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();
}

__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();
}

...全文
相关推荐
CUDA实现的直方图均衡化算法
因做毕设接触到CUDA这个东西,于是就开始了一段漫长的学习CUDA的过程!关于直方图均衡化算法,也是一时兴起想实现一下。最开始是看CUDA的samples里面有一个histogram64和histog
基于CUDA加速的灰度与彩色图像直方图均衡化对比度增强工具实战
图像对比度增强是数字图像处理中的基础且关键环节,其核心目标是通过调整图像像素的灰度分布,使图像细节更加清晰、易于识别。该技术广泛应用于医学成像、卫星遥感、视频监控以及摄影后期处理等多个领域。常见的对比度增强方法包括线性拉伸、伽马校正、自适应增强以及直方图均衡化等。其中,直方图均衡化因其原理清晰、实现简单、效果显著,成为最常用的增强手段之一。在本章中,我们重点引出直方图均衡化的基本思想,即通过重新分布图像的灰度值,使其覆盖更广泛的动态范围,从而增强图像整体对比度。
Histequ直方图均衡化
C语言实现直方图均衡化通常包含以下步骤:1. **计算直方图**:遍历图像中的每个像素,统计每个灰度级别的像素数量,生成原始直方图。2.
图像对比度增强工具:对灰度图像和彩色图像均进行直方图均衡化
直方图均衡化是实现这一目标的常用方法之一。本文将深入探讨直方图均衡化及其在处理灰度图像和彩色图像中的应用,同时会提及如何利用CUDA GPU编程来加速这一过程。
OCR_SSD:OCR的纯cuda代码
- OCR算法,如Tesseract或Leptonica的CUDA版本,用于识别文字区域内的字符。- 图像预处理模块,可能包括灰度化、二值化、直方图均衡化等步骤,以优化文字识别效果。


