Delphi图像处理 -- 图像翻转(镜像)

对图像的翻转处理,是产生一个与原图像在水平方向或者垂直方向相对称的镜像图像。

图像翻转的原理很简单,就是以图像的中间列像素(水平方向),或者中间行像素(垂直方向)为基列(行),将图像第一列(行)的像素与图像最后一列(行)的像素相交换,图像第二列(行)的像素与图像倒数第二列(行)的像素相交换......,直至基列(行)为止,如果图像的列(行)数是偶数,则头尾对应的列(行),包括基列(行)在内两两交换,如果图像的列(行)数是偶数,则基列(行)不变,其它头尾对应的列(行)两两交换。

下面是图像翻转的实现代码:

type // 图像翻转方式: 水平,垂直 TReversalMode = (rmHorizontal, rmVertical); 过程定义: // 翻转图像 procedure ImageReversal(var Data: TImageData; Mode: TReversalMode); 实现代码: procedure ImageReversal(var Data: TImageData; Mode: TReversalMode); var srcOffset, dstOffset: Integer; asm push esi push edi push ebx xchg eax, edx mov esi, [edx].TImageData.Scan0 mov ebx, [edx].TImageData.Stride mov ecx, [edx].TImageData.Width mov edx, [edx].TImageData.Height mov srcOffset, ebx // srcOffset = Data.Stride cmp al, rmHorizontal je @@1 mov edi, edx // if (Mode == rmVertical) dec edi // { imul edi, ebx // esi = Data.Scan0 add edi, esi // edi = Data.Scan0 + shr edx, 1 // (Data.Height - 1) * Data.Stride neg ebx // dstOffset = -Data.Stride mov eax, 4 // edx = Data.Height / 2; eax = 4 jmp @@2 // } @@1: mov edi, esi // else mov esi, ecx // { dec esi // edi = Data.Scan0 shl esi, 2 // esi = Data.Scan0 + (Data.Width - 1) * 4 add esi, edi // dstOffset = Data.Stride shr ecx, 1 // ecx = Data.Width / 2; eax = -4 mov eax, -4 // } @@2: mov dstOffset, ebx mov ebx, eax // ebx = eax // 4 or -4 cld @yLoop: // for (y = edx; y > 0; y --) push ecx // { push esi // Save(esi) push edi // Save(edi) @xLoop: // for (x = ecx; x > 0; x --) mov eax, [edi] // { xchg eax, [esi] // xchg([esi], [edi]) stosd // edi += 4 add esi, ebx // esi += ebx loop @xLoop // } pop edi // Reset(edi) pop esi // Reset(esi) pop ecx add esi, srcOffset // esi += srcOffset add edi, dstOffset // edi += dstOffset dec edx jnz @yLoop // } pop ebx pop edi pop esi end;

下面给出一个完全等价的纯PAS代码图像翻转过程代码,供不太懂BASM代码的朋友学习和使用:

procedure ImageReversal(Data: TImageData; Mode: TReversalMode); var x, y: Integer; Width, Height: Integer; ps, pd, ps0, pd0: PLongWord; tmp: LongWord; Delta, dstOffset: Integer; begin Width := Data.Width; Height := Data.Height; if Mode = rmHorizontal then begin pd := Data.Scan0; ps := PLongWord(Integer(pd) + (Data.Width shl 2) - 4); dstOffset := Data.Stride; Delta := -1; Width := Width shr 1; end else begin ps := Data.Scan0; pd := PLongWord(Integer(ps) + (Data.Height - 1) * Data.Stride); dstOffset := -Data.Stride; Delta := 1; Height := Height shr 1; end; for y := 1 to Height do begin pd0 := pd; ps0 := ps; for x := 1 to Width do begin tmp := pd0^; pd0^ := ps0^; ps0^ := tmp; Inc(pd0); Inc(ps0, Delta); end; Inc(Integer(ps), Data.Stride); Inc(Integer(pd), dstOffset); end; end;

下面是个图像水平翻转的例子代码:

var Data: TImageData; begin Data := GetImageData(TGpBitmap.Create('d:/001-1.jpg'), True); DrawImage(Canvas, 0, 0, Data); ImageReversal(Data, rmHorizontal); DrawImage(Canvas, Data.Width, 0, Data); FreeImageData(Data); end;

代码中的DrawImage过程见《Delphi图像处理 -- 图像显示》。

例子运行后的镜像效果图如下,左边是原图,右边是水平镜像图:

图像水平镜像

文章中使用GDI+版本下载地址和说明见《GDI+ for VCL基础 -- GDI+ 与 VCL》。

文章中所用数据类型及一些过程见《Delphi图像处理 -- 数据类型及内部过程》和《Delphi图像处理 -- 图像像素结构与图像数据转换》。

尽管我十分努力,但水平有限,错误在所难免,欢迎指正和指导。邮箱地址:

maozefa@hotmail.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi11 是最新的 Delphi 版本,而 `delphi-opencv-master` 是一个开源的 Delphi 与 OpenCV 集成的项目,它提供了一组 Delphi 封装的 OpenCV 函数和类,方便 Delphi 开发者使用 OpenCV 进行图像处理和计算机视觉操作。 在 Delphi11 中,你可以通过以下步骤来使用 `delphi-opencv-master`: 1. 首先,你需要下载 `delphi-opencv-master` 项目的源代码,可以从 GitHub 上下载:https://github.com/Laex/Delphi-OpenCV 2. 解压缩下载的源代码,并将其中的 `OpenCV` 文件夹复制到 Delphi11 项目的根目录下。 3. 在 Delphi11 中打开你的项目,然后在菜单栏中选择 `Project` -> `Options` -> `Delphi Compiler` -> `Search Path`,将 OpenCV 文件夹所在的路径添加到搜索路径中。 4. 在 Delphi11 中使用 `uses` 语句引入 `OpenCV_Image` 单元,并调用其中的函数和类来进行图像处理和计算机视觉操作。 例如,以下代码演示了如何使用 `delphi-opencv-master` 进行图像读取和灰度化: ``` uses OpenCV_Image; var img: IplImage; begin // 读取图像 img := LoadImage('lena.jpg'); // 将图像转换为灰度图像 cvCvtColor(img, img, CV_RGB2GRAY); // 显示图像 ShowImage('My Image', img); // 等待用户按下任意键 WaitKey; // 释放图像内存 img.Release; end; ``` 这段代码使用了 `OpenCV_Image` 单元中提供的 `LoadImage` 函数和 `ShowImage` 函数来读取和显示图像,使用了 OpenCV 库中的 `cvCvtColor` 函数将图像转换为灰度图像。你可以根据自己的需要,使用 `delphi-opencv-master` 中提供的其他函数和类来进行更加复杂的图像处理和计算机视觉操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值