10.1国庆后,知名博主:laviewpbt  http://www.cnblogs.com/Imageshop/

发起了一个优化3x3中值模糊的小活动。

俺也参加其中,今天博主laviewpbt  共享了一份不错的CLAHE代码。

free精神,真心为其点赞。

故俺也分享这份最快的3x3中值模糊的代码。

///	编写者: laviewpbt,  编写时间: 2015.10.16, 联系QQ: 33184777

/// <summary>
/// 快速的实现3*3大小的中值模糊,边缘1像素未做处理。(2015.10.12日)
/// </summary>
/// <param name="Src">原始数据。</param>
/// <param name="Dest">目标数据。</param>
/// 百度: Fast median search_ an ANSI C implementation.html
/// 优化版本: 落羽の殇 联系QQ:200759103 static unsigned int* pixGreater = NULL;
static unsigned int* pixLess = NULL;
static unsigned int cmpTable[256 * 256 * 2] = { 0 };
class autoCmpTable
{
public:
autoCmpTable() {
unsigned int x, y, p;
unsigned int tableLength = 256 * 256;
pixGreater = cmpTable;
pixLess = cmpTable + tableLength;
for (x = 0; x < 256; x++) {
for (y = 0; y < 256; y++) {
p = x + y * 256;
if (x > y)
{
pixLess[p] = x;
pixGreater[p] = y;
}
else
{
pixGreater[p] = x;
pixLess[p] = y;
}
}
}
}
};
static autoCmpTable initCmpTable; IS_RET __stdcall Fastest33MedianBlur(TMatrix *Src, TMatrix *Dest)
{
if (Src == NULL || Dest == NULL) return IS_RET_ERR_NULLREFERENCE;
if (Src->Data == NULL || Dest->Data == NULL) return IS_RET_ERR_NULLREFERENCE;
if (Src->Width != Dest->Width || Src->Height != Dest->Height || Src->Channel != Dest->Channel || Src->Depth != Dest->Depth || Src->WidthStep != Dest->WidthStep) return IS_RET_ERR_PARAMISMATCH;
if (Src->Depth != IS_DEPTH_8U || Dest->Depth != IS_DEPTH_8U) return IS_RET_ERR_NOTSUPPORTED;
IS_RET Ret = IS_RET_OK; if (!pixGreater&&!pixLess)
{
return IS_RET_ERR_NOTSUPPORTED;
}
if (Src->Data == Dest->Data)
{
TMatrix *Clone = NULL;
Ret = IS_CloneMatrix(Src, &Clone);
if (Ret != IS_RET_OK) return Ret;
Ret = Fastest33MedianBlur(Clone, Dest);
IS_FreeMatrix(&Clone);
return Ret;
}
unsigned int X, Y, Width = Src->Width, Height = Src->Height;
unsigned char *LineP0, *LineP1, *LineP2, *LinePD;
unsigned int srcWidthStep = Src->WidthStep;
unsigned int dstWidthStep = Dest->WidthStep;
unsigned int srcChannel = Src->Channel;
unsigned int dstChannel = Dest->Channel;
unsigned char* SrcData = Src->Data;
unsigned char* DstData = Dest->Data; if (srcChannel == 1)
{
unsigned int Gray0, Gray1, Gray2, Gray3, Gray4, Gray5, Gray6, Gray7, Gray8, pos;
for (Y = 1; Y < Height - 1; Y++)
{
LineP0 = SrcData + (Y - 1) * srcWidthStep + 1;
LineP1 = LineP0 + srcWidthStep;
LineP2 = LineP1 + srcWidthStep;
LinePD = DstData + Y *dstWidthStep + 1;
for (X = 1; X < Width - 1; X++)
{
Gray0 = LineP0[X - 1];
Gray1 = LineP0[X];
Gray2 = LineP0[X + 1];
Gray3 = LineP1[X - 1];
Gray4 = LineP1[X];
Gray5 = LineP2[X + 1];
Gray6 = LineP2[X - 1];
Gray7 = LineP2[X];
Gray8 = LineP2[X + 1];
/* if (Gray1 > Gray2) Swap(Gray1, Gray2);*/
pos = Gray1 + Gray2 * 256;
Gray2 = pixLess[pos];
Gray1 = pixGreater[pos];
/* if (Gray4 > Gray5) Swap(Gray4, Gray5);*/
pos = Gray4 + Gray5 * 256;
Gray5 = pixLess[pos];
Gray4 = pixGreater[pos];
/* if (Gray7 > Gray8) Swap(Gray7, Gray8);*/
pos = Gray7 + Gray8 * 256;
Gray8 = pixLess[pos];
Gray7 = pixGreater[pos];
/* if (Gray0 > Gray1) Swap(Gray0, Gray1);*/
pos = Gray0 + Gray1 * 256;
Gray1 = pixLess[pos];
Gray0 = pixGreater[pos];
/* if (Gray3 > Gray4) Swap(Gray3, Gray4);*/
pos = Gray3 + Gray4 * 256;
Gray4 = pixLess[pos];
Gray3 = pixGreater[pos];
/* if (Gray6 > Gray7) Swap(Gray6, Gray7);*/
pos = Gray6 + Gray7 * 256;
Gray7 = pixLess[pos];
Gray6 = pixGreater[pos];
/* if (Gray1 > Gray2) Swap(Gray1, Gray2);*/
pos = Gray1 + Gray2 * 256;
Gray2 = pixLess[pos];
Gray1 = pixGreater[pos];
/* if (Gray4 > Gray5) Swap(Gray4, Gray5);*/
pos = Gray4 + Gray5 * 256;
Gray5 = pixLess[pos];
Gray4 = pixGreater[pos];
/* if (Gray7 > Gray8) Swap(Gray7, Gray8);*/
pos = Gray7 + Gray8 * 256;
Gray8 = pixLess[pos];
Gray7 = pixGreater[pos];
/* if (Gray0 > Gray3) Swap(Gray0, Gray3);*/
pos = Gray0 + Gray3 * 256;
Gray3 = pixLess[pos];
Gray0 = pixGreater[pos];
/* if (Gray5 > Gray8) Swap(Gray5, Gray8);*/
pos = Gray5 + Gray8 * 256;
Gray8 = pixLess[pos];
Gray5 = pixGreater[pos];
/* if (Gray4 > Gray7) Swap(Gray4, Gray7);*/
pos = Gray4 + Gray7 * 256;
Gray7 = pixLess[pos];
Gray4 = pixGreater[pos];
/* if (Gray3 > Gray6) Swap(Gray3, Gray6);*/
pos = Gray3 + Gray6 * 256;
Gray6 = pixLess[pos];
Gray3 = pixGreater[pos];
/* if (Gray1 > Gray4) Swap(Gray1, Gray4);*/
pos = Gray1 + Gray4 * 256;
Gray4 = pixLess[pos];
Gray1 = pixGreater[pos];
/* if (Gray2 > Gray5) Swap(Gray2, Gray5);*/
pos = Gray2 + Gray5 * 256;
Gray5 = pixLess[pos];
Gray2 = pixGreater[pos];
/* if (Gray4 > Gray7) Swap(Gray4, Gray7);*/
pos = Gray4 + Gray7 * 256;
Gray7 = pixLess[pos];
Gray4 = pixGreater[pos];
/* if (Gray4 > Gray2) Swap(Gray4, Gray2);*/
pos = Gray4 + Gray2 * 256;
Gray2 = pixLess[pos];
Gray4 = pixGreater[pos];
/* if (Gray6 > Gray4) Swap(Gray6, Gray4);*/
pos = Gray6 + Gray4 * 256;
Gray4 = pixLess[pos];
Gray6 = pixGreater[pos];
/* if (Gray4 > Gray2) Swap(Gray4, Gray2); */
pos = Gray4 + Gray2 * 256;
Gray2 = pixLess[pos];
Gray4 = pixGreater[pos]; LinePD[1] = Gray4;
LinePD++;
}
}
return Ret;
}
else
{
TMatrix *Blue = NULL, *Green = NULL, *Red = NULL, *Alpha = NULL; // 由于C变量如果不初始化,其值是随机值,可能会导致释放时的错误。
IS_RET Ret = SplitRGBA(Src, &Blue, &Green, &Red, &Alpha);
if (Ret != IS_RET_OK) goto Done24;
#pragma omp parallel num_threads(3)
{
#pragma omp sections
{
#pragma omp section
{
Ret = Fastest33MedianBlur(Blue, Blue);
}
#pragma omp section
{
Ret = Fastest33MedianBlur(Green, Green);
}
#pragma omp section
{
Ret = Fastest33MedianBlur(Red, Red);
} }
}
Ret = CombineRGBA(Dest, Blue, Green, Red, Alpha);
Done24:
IS_FreeMatrix(&Blue);
IS_FreeMatrix(&Green);
IS_FreeMatrix(&Red);
IS_FreeMatrix(&Alpha);
return Ret;
} return Ret;
}

  关于交换法短值快速排序的参考资料见:https://github.com/afniHQ/AFNI/blob/ab8ca253b784ae71401927df88da2bc6e16d07c1/src/cs_qsort_small.h

最快的3x3中值模糊的更多相关文章

  1. 【算法随记三】小半径中值模糊的急速实现(16MB图7.5ms实现) + Photoshop中蒙尘和划痕算法解读。

    在本人的博客里,分享了有关中值模糊的O(1)算法,详见:任意半径中值滤波(扩展至百分比滤波器)O(1)时间复杂度算法的原理.实现及效果 ,这里的算法的执行时间和参数是无关的.整体来说,虽然速度也很快, ...

  2. Emgu-WPF学习使用-中值模糊

    原文:Emgu-WPF学习使用-中值模糊 实现效果: 实现途径: 前提:Image File-> System.Drawing.Bitmap->Image<Bgr, byte> ...

  3. OpenCV笔记(1)(图片读取与现实、色彩空间、基础运算、均值方差、逻辑运算、泛洪填充、均值中值及自定义平滑)

    一.图片读取和显示 import cv2 as cv # 图片读取cv.imread(img_path) car_img = cv.imread("car1.png") # 图片显 ...

  4. opencv-11-中值滤波及自适应中值滤波

    开始之前 在上一篇我们实现了读取噪声图像, 然后 进行三种形式的均值滤波得到结果, 由于我们自己写的均值滤波未作边缘处理, 所以效果有一定的下降, 但是总体来说, 我们得到的结果能够说明我们的算法执行 ...

  5. OpenCV计算机视觉学习(4)——图像平滑处理(均值滤波,高斯滤波,中值滤波,双边滤波)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice &q ...

  6. Atitit   图像处理 平滑 也称 模糊, 归一化块滤波、高斯滤波、中值滤波、双边滤波)

    Atitit   图像处理 平滑 也称 模糊, 归一化块滤波.高斯滤波.中值滤波.双边滤波) 是一项简单且使用频率很高的图像处理方法 用途 去噪 去雾 各种线性滤波器对图像进行平滑处理,相关OpenC ...

  7. opencv3 图片模糊操作-均值滤波 高斯滤波 中值滤波 双边滤波

    #include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; ...

  8. 学习 opencv---(8)非线性滤波:中值滤波,双边滤波

    正如我们上一篇文章中讲到的,线性滤波可以实现很多种不同的图像变换.然而非线性滤波,如中值滤波器和双边滤波器,有时可以达到更好的实现效果. 邻域算子的其他一些例子还有对 二值图像进行操作的形态学算子,用 ...

  9. 基于FPGA的中值滤波算法实现

    在这一篇开篇之前,我需要解决一个问题,上一篇我们实现了基于FPGA的均值滤波算法的实现,最后的显示效果图上发现有一些黑白色的斑点,我以为是椒盐噪声,然后在做基于FPGA的中值滤波算法的实验时,我发现黑 ...

随机推荐

  1. python全栈学习--day3

    一.基础数据类型 基础数据类型,有7种类型,存在即合理. 1.int 整数 主要是做运算的 .比如加减乘除,幂,取余  + - * / ** %...2.bool 布尔值 判断真假以及作为条件变量3. ...

  2. CodeBlocks使用介绍

    CodeBlocks对单个文件没法调试,需要建工程后才能调试,所以使用CodeBlocks必须先建工程. 一.如何用CodeBlocks建工程文件. 选择File->New->Projec ...

  3. 2017-2018-1 1623 bug终结者 冲刺002

    bug终结者 冲刺002 by 20162329 张旭升 今日冲刺任务: 能够显示主菜单和功能 游戏需要提供主菜单让玩家进行游戏设置,同时能能够把地图文件中的信息转换成为图像显示到游戏界面上 能够实现 ...

  4. C语言--期末总结

    一. 1.当初你是如何做出选择计算机专业的决定的?经过一个学期,你的看法改变了么,为什么? 你觉得计算机是你喜欢的领域吗,它是你擅长的领域吗? 为什么? 答:当初报志愿的时候,没有具体的想法,只凭借着 ...

  5. scrapy crawl xmlfeed spider

    from scrapy.spiders import XMLFeedSpider from myxml.items import MyxmlItem class XmlspiderSpider(XML ...

  6. OSI七层协议模型、TCP/IP四层模型学习笔记

    1. OSI七层和TCP/IP四层的关系 1.1 OSI引入了服务.接口.协议.分层的概念,TCP/IP借鉴了OSI的这些概念建立TCP/IP模型. 1.2 OSI先有模型,后有协议,先有标准,后进行 ...

  7. Python 迭代器之列表解析与生成器

     [TOC] 1. 列表解析 1.1 列表解析基础 列表解析把任意一个表达式应用到一个迭代对象中的元素 Python内置ord函数会返回一个字符的ASCII整数编码(chr函数是它的逆过程, 它将A ...

  8. B+树介绍

    B+树 B+树和二叉树.平衡二叉树一样,都是经典的数据结构.B+树由B树和索引顺序访问方法(ISAM,是不是很熟悉?对,这也是MyISAM引擎最初参考的数据结构)演化而来,但是在实际使用过程中几乎已经 ...

  9. KNN算法简单应用

    这里是写给小白看的,大牛路过勿喷. 1 KNN算法简介 KNN(K-Nearest Neighbor)工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集 ...

  10. 安卓手机USB共享网络给PC上网

    开端 哈哈,最近我又发现了一个校园网的漏洞,但是只能手机连接,于是就想手机连接之后通过usb共享给电脑上网. 在手机上连接校园网WiFi,开启USB网络共享并且连接电脑之后,却发现电脑十分的卡顿!CP ...