Delphi图像处理 -- 最小值
阅读提示:
《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图像处理 -- 最小值的更多相关文章
- Delphi图像处理 -- 文章索引
转载:http://blog.csdn.net/maozefa/article/details/7188354 本文对已发布<Delphi图像处理>系列文章进行索引链接,以方便阅读和查找. ...
- Delphi图像处理 -- 最大值
阅读提示: <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM. <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...
- Delphi图像处理 -- RGB与HSV转换
阅读提示: <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM. <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...
- Delphi图像处理 -- RGB与HSL转换
阅读提示: <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM. <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...
- Delphi图像处理 -- 颜色矩阵变换
转载自阿发伯:http://blog.csdn.net/maozefa/article/details/8316430 阅读提示: <Delphi图像处理>系列以效率为侧重点,一般 ...
- Delphi图像处理控件
Envision Image Library (Full Sources for D7 to D10-Seattle) v3.08http://www.intervalsoftware.com/env ...
- delphi 图像处理 图像左旋右旋
procedure TDR_QM_ZP_Form.btn_ZXClick(Sender: TObject); //图像左旋 begin screen.Cursor := crhourglass; my ...
- delphi 图像处理 图像放大缩小
procedure TDR_QM_ZP_Form.btn_FDClick(Sender: TObject); //图像放大 begin my_int1 := Trunc( my_int1 * 1.1) ...
- delphi 图像处理 二值化
procedure TDR_QM_ZP_Form.Image_EZH( Bmp: TBitmap ); var p: PByteArray; Gray, x, y: Integer; begin // ...
随机推荐
- ASP.NET MVC 5 学习教程:添加查询
原文 ASP.NET MVC 5 学习教程:添加查询 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 通过控 ...
- 基于visual Studio2013解决算法导论之042单源最短路径
题目 单源最短路径 解决代码及点评 // 26单源最短路径bellmanford.cpp : 定义控制台应用程序的入口点. // #include <iostream> #incl ...
- (未解决)在JSTL中,session 和 sessionScope 有什么区别 ??
在JSP页面中,使用JSTL标签获取Session中的值并显示 为何当使用 ${session.user} 时,页面跳转后,第一次能够成功显示, 但是单击按钮重定向的时候,就获取不到了? 而使用 ${ ...
- sprintf,你知道多少?
选自<CSDN 社区电子杂志——C/C++杂志>http://emag.csdn.net 2005 年1 月 总第1 期 - 93 -本文作者:steedhorse(晨星)printf 可 ...
- 客户机增加域 及server文件共享
客户机要增加域,右击我的电脑--属性--更改--域,输入域名.例:输入域名company.com中的company , 后面的com不要加. 再在弹出的窗体中输入域管理员的完整username(use ...
- C#动态增加边框
if (this.Width >= 600) { timer1.Enabled = false; } else { this.Width += 30; }
- arm: 使用结构体操作寄存器
使用结构体操作寄存器: //寄存器赋值和取值的时候,要注意寄存器的长度,有的寄存器的值只有8位. //还要注意,使用volatile修饰寄存器变量.volatile 参考http://www.cnbl ...
- JavaScript 字符串编码函数
JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decod ...
- 初始WebApi 利用WebApi实现基础的CRUD
微软的web api是在vs2012上的mvc4项目绑定发行的,它提出的web api是完全基于RESTful标准的,完全不同于之前的(同是SOAP协议的)wcf和webService.它是简单,代码 ...
- UVALive 6584 Escape (Regionals 2013 >> Europe - Central)
题目 给出一棵树,每个节点有一个怪物或血药,遇到怪物必须打,打完后扣掉一定的血量. 一开始英雄的血量为\(0\),当血量小于\(0\)时就挂了. 给出英雄的起点和终点,问能否成功到达终点. 算法 这题 ...