阅读提示:

    《Delphi图像处理》系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM。

    《C++图像处理》系列以代码清晰,可读性为主,全部使用C++代码。

    尽可能保持二者内容一致,可相互对照。

    本文代码必须包括文章《Delphi图像处理 -- 数据类型及公用过程》中的ImageData.pas单元。

图像的最小值处理就是以当前像素为中心,取周边一定半径范围内的所有像素的RGB分量的最小值,作为当前像素的分量值。如果图像含Alpha信息,则应对Alpha分量作一个相反的处理,即最大值处理。

procedure DoMinValue(var Dest: TImageData; const Source: TImageData; Radius: Integer);
var
height, iOffset, jOffset, dstOffset, srcOffset: Integer;
asm
push esi
push edi
push ebx
push ecx
shl ecx, 1
mov ebx, [edx].TImageData.Stride
imul ebx, ecx
shl ecx, 2
add ebx, ecx
sub ebx, 4
neg ebx
mov iOffset, ebx
mov ebx, [edx].TImageData.Stride
push ebx
shl ebx, 1
sub ebx, ecx
mov jOffset, ebx
call _SetCopyRegs
mov dstOffset, ebx
mov srcOffset, eax
mov height, edx
pop ebx
pop eax
@@yLoop:
push ecx
@@xLoop:
mov edx, eax
pcmpeqb mm0, mm0
movq mm1, mm0
movq mm2, mm0
@@iLoop:
push eax
@@jLoop:
pminub mm1, [esi]
pminub mm2, [esi+ebx]
add esi, 8
dec eax
jnz @@jLoop
movd mm3, [esi]
movd mm4, [esi+ebx]
pminub mm0, mm3
pminub mm0, mm4
pop eax
add esi, jOffset
dec edx
jnz @@iLoop
push eax
@@jlLoop:
pminub mm1, [esi]
add esi, 8
dec eax
jnz @@jlLoop
movd mm3, [esi]
pminub mm0, mm3
pop eax
pminub mm0, mm1
pminub mm0, mm2
psrlq mm1, 32
psrlq mm2, 32
pminub mm0, mm1
pminub mm0, mm2
movd [edi], mm0
add esi, iOffset
add edi, 4
loop @@xLoop
pop ecx
add esi, srcOffset
add edi, dstOffset
dec height
jnz @@yLoop
pop ebx
pop edi
pop esi
emms
end; procedure DoMaxAlpha(var Dest: TImageData; const Source: TImageData; Radius: Integer);
var
height, iOffset, jOffset, dstOffset, srcOffset: Integer;
asm
push esi
push edi
push ebx
shl ecx, 1
inc ecx
push ecx
mov ebx, [edx].TImageData.Stride
imul ebx, ecx
sub ebx, 4
neg ebx
mov iOffset, ebx
shl ecx, 2
mov ebx, [edx].TImageData.Stride
sub ebx, ecx
mov jOffset, ebx
call _SetCopyRegs
mov dstOffset, ebx
mov srcOffset, eax
mov height, edx
add esi, 3
add edi, 3
pop edx
@@yLoop:
push ecx
@@xLoop:
mov ebx, edx
xor eax, eax
@@iLoop:
push edx
@@jLoop:
cmp al, [esi]
jae @@1
mov al, [esi]
@@1:
add esi, 4
dec edx
jnz @@jLoop
pop edx
add esi, jOffset
dec ebx
jnz @@iLoop
mov [edi], al
add esi, iOffset
add edi, 4
loop @@xLoop
pop ecx
add esi, srcOffset
add edi, dstOffset
dec height
jnz @@yLoop
pop ebx
pop edi
pop esi
end; // 图像数据最小值处理。参数:图像数据,半径
procedure ImageMinValue(var Data: TImageData; Radius: Integer);
var
src: TImageData;
begin
if Data.AlphaFlag then
ArgbConvertPArgb(Data); // 如果图像数据含Alpha信息,转换为PARGB
src := _GetExpandData(Data, Radius);// 获取扩展半径后的图像数据源
DoMinValue(Data, src, Radius); // 图像数据的最小值处理
if Data.AlphaFlag then // 如果图像数据含Alpha信息
begin
DoMaxAlpha(Data, src, Radius); // Alpha分量作最大值处理
PArgbConvertArgb(Data); // 还原PARGB为ARGB
end;
FreeImageData(src);
end;

调用例子及运行效果:

procedure TForm1.Button3Click(Sender: TObject);
var
bmp: TGpBitmap;
g: TGpGraphics;
data: TImageData;
begin
// bmp := TGpBitmap.Create('..\..\media\apple.png');
bmp := TGpBitmap.Create('..\..\media\source.bmp');
data := LockGpBitmap(bmp);
ImageMinValue(data, 3);
UnlockGpBitmap(bmp, data);
g := TGpGraphics.Create(Canvas.Handle);
g.DrawImage(bmp, 140, 0);
g.Free;
bmp.Free;
end;

《Delphi图像处理》系列使用GDI+单元下载地址和说明见文章《GDI+ for VCL基础 -- GDI+ 与 VCL》。

    因水平有限,错误在所难免,欢迎指正和指导。邮箱地址:maozefa@hotmail.com

这里可访问《Delphi图像处理 -- 文章索引》。

Delphi图像处理 -- 最小值的更多相关文章

  1. Delphi图像处理 -- 文章索引

    转载:http://blog.csdn.net/maozefa/article/details/7188354 本文对已发布<Delphi图像处理>系列文章进行索引链接,以方便阅读和查找. ...

  2. Delphi图像处理 -- 最大值

    阅读提示:     <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM.     <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...

  3. Delphi图像处理 -- RGB与HSV转换

    阅读提示:     <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM.     <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...

  4. Delphi图像处理 -- RGB与HSL转换

    阅读提示:     <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM.     <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...

  5. Delphi图像处理 -- 颜色矩阵变换

    转载自阿发伯:http://blog.csdn.net/maozefa/article/details/8316430 阅读提示:     <Delphi图像处理>系列以效率为侧重点,一般 ...

  6. Delphi图像处理控件

    Envision Image Library (Full Sources for D7 to D10-Seattle) v3.08http://www.intervalsoftware.com/env ...

  7. delphi 图像处理 图像左旋右旋

    procedure TDR_QM_ZP_Form.btn_ZXClick(Sender: TObject); //图像左旋 begin screen.Cursor := crhourglass; my ...

  8. delphi 图像处理 图像放大缩小

    procedure TDR_QM_ZP_Form.btn_FDClick(Sender: TObject); //图像放大 begin my_int1 := Trunc( my_int1 * 1.1) ...

  9. delphi 图像处理 二值化

    procedure TDR_QM_ZP_Form.Image_EZH( Bmp: TBitmap ); var p: PByteArray; Gray, x, y: Integer; begin // ...

随机推荐

  1. Codeforces Round #254 (Div. 2) DZY Loves Chemistry【并查集基础】

    一开始不知道题意是啥意思,迟放进去反应和后放进去反应有什么区别 对于第三组数据不是很懂,为啥312,132的组合是不行的 后来发现这是一道考察并查集的题目 QAQ 怒贴代码: #include < ...

  2. 制作Linux(Fedora、Ubuntu、CentOS)优盘启动

    随着嵌入式技术的快速发展,Linux快速发展过一段时间.虽然现在不是很热,但是linux在现实社会的使用还是很有用处.而光盘有有些落伍,不仅浪费而且不环保,所以质优价廉的优盘就脱颖而出.所以,用优盘制 ...

  3. csu1306: Manor

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1306 解题思路:唬人的水题,只要按照他的意思打,就能过,不过,数组最好开大点.用到优先队列,也可以 ...

  4. JavaScript的实现

    了解了JavaScript是干什么的< 对一些词的理解 >,下面该知道它是怎么实现的. 一个完整的JavaScript是由三部分组成的,如下图 ECMAScript 可以为不同种类的宿主环 ...

  5. POJ 2777 线段树基础题

    题意: 给你一个长度为N的线段数,一开始每个树的颜色都是1,然后有2个操作. 第一个操作,将区间[a , b ]的颜色换成c. 第二个操作,输出区间[a , b ]不同颜色的总数. 直接线段树搞之.不 ...

  6. 网页制作之html基础学习5-background-position用法

    我们知道在用图片作为背景的时候,css要这样写,以div容器举例子,也可以是body.td.p等的背景,道理一样. 代码: div{ background:#FFF url(image) no-rep ...

  7. MySQL新建用户,授权,删除用户,修改密码等命令

    首先要声明一下:一般情况下,修改MySQL密码,授权,是需要有mysql里的root权限的. 注:本操作是在WIN命令提示符下,phpMyAdmin同样适用.     用户:phplamp   用户数 ...

  8. extern、static、auto、register 定义变量的不同用法

    首先得说明什么叫“编译单元”.每个 .c 文件会被编译为一个 .o 文件,这个就是一个编译单元.最后所有的编译单元被链接起来,就是一个库或一个程序. 一个变量/函数,只要是在全局声明的,链接之后都隐含 ...

  9. 进入MAC下面的Library目录

    从LION后,苹果将library目录隐藏起来了,要进入那个目录,需要用到一定的技巧. 打开Finder,按下shift+command+g,输入“~/Library”(输入引号里面的),再按回车就到 ...

  10. python xpath

    提取Item 选择器介绍 我们有很多方法从网站中提取数据.Scrapy 使用一种叫做 XPath selectors的机制,它基于 XPath表达式.如果你想了解更多selectors和其他机制你可以 ...