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 // ...
随机推荐
- Ubuntu服务器上SSH Server 的安装和设置
网上有很多介绍在Ubuntu下开启SSH服务的文章,但大多数介绍的方法测试后都不太理想,均不能实现远程登录到Ubuntu上,最后分析原因是都没有真正开启ssh-server服务.最终成功的方法如下: ...
- 设计模式(六)桥连模式Bridge(结构型)
设计模式(六)桥连模式Bridge(结构型) 1. 概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够 ...
- HDU2191:悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包)
Problem Description 急!灾区的食物依然短缺! 为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品 ...
- poj3308 Paratroopers --- 最小点权覆盖->最小割
题目是一个非常明显的二分图带权匹配模型, 加入源点到nx建边,ny到汇点建边,(nx.ny)=inf建边.求最小割既得最小点权覆盖. 在本题中因为求的是乘积,所以先所有取log转换为加法,最后再乘方回 ...
- SqlServer字段说明查询(表基本信息查询)
--快速查看表结构(比较全面的) THEN obj.name ELSE '' END AS 表名, col.colorder AS 序号 , col.name AS 列名 , ISNULL(ep.[v ...
- Android之ksoap2-android详解与调用天气预报Webservice完整实例
Google为Android平台开发Web Service客户端提供了ksoap2-android项目,在这个网址下载开发包http://code.google.com/p/ksoap2-androi ...
- 什么是DNS劫持
我们知道,某些网络运营商为了某些目的,对DNS进行了某些操作,导致使用ISP的正常上网设置无法通过域名取得正确的IP地址.常用的手段有:DNS劫持和DNS污染. 什么是DNS劫持 DNS劫持就是通过劫 ...
- 盘点:#AzureChat - 虚拟机和自动伸缩
感谢大家跟 Corey Sanders 和 Stephen Siciliano 一起参加本次 #AzureChat.我们很高兴能借这次在线讨论的机会,倾听各位社区成员对我们最受欢迎的两个主题的意见 - ...
- android 调用系统打电话和发短,懒得记
Intent intent = new Intent(); intent.setAction(Intent.ACTION_CALL); intent.setData( ...
- 使用BAT方法结束进程
@echo off taskkill /f /im GAM.exe taskkill /f /im GCL10.exe http://www.cnblogs.com/FKdelphi/p/501540 ...