阅读提示:

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

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

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

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

const
_fc0: Single = 0.0;
_fc1: Single = 1.0;
_fc6: Single = 6.0;
_fc60: Single = 60.0;
_fc255: Single = 255.0;
_fc360: Single = 360.0; procedure ColorToHSV(var H, S, V: Single; Color: TARGB);
asm
push eax
push edx
push ecx
movzx ecx, Color.TARGBQuad.Blue
movzx edx, Color.TARGBQuad.Green
movzx eax, Color.TARGBQuad.Red
cmp ecx, edx // ecx = rgbMax
jge @@1 // edx = rgbMin
xchg ecx, edx
@@1:
cmp ecx, eax
jge @@2
xchg ecx, eax
@@2:
cmp edx, eax
cmova edx, eax
cvtsi2ss xmm0, ecx
movaps xmm1, xmm0
divss xmm0, _fc255
pop eax
movss [eax], xmm0 // *V = rgbMax / 255
mov eax, ecx
sub ecx, edx // delta = rgbMax - rgbmin
jnz @@3
pop edx // if (delta == 0)
pop eax // {
mov [eax], ecx // *H = *S = 0
mov [edx], ecx // return
jmp @@Exit // }
@@3:
cvtsi2ss xmm0, ecx
movaps xmm2, xmm0
divss xmm0, xmm1
pop edx
movss [edx], xmm0 // *S = delta / rgbMax
cmp al, Color.TARGBQuad.Red
jne @@5
movzx eax, Color.TARGBQuad.Green
movzx edx, Color.TARGBQuad.Blue
xor ecx, ecx // if (R == rgbMax) eax = G - B; add = 0
jmp @@7
@@5:
cmp al, Color.TARGBQuad.Green
jne @@6
movzx eax, Color.TARGBQuad.Blue
movzx edx, Color.TARGBQuad.Red
mov ecx, 120 // if (G == rgbMax) eax = B - R; add = 120
jmp @@7
@@6:
movzx eax, Color.TARGBQuad.Red
movzx edx, Color.TARGBQuad.Green
mov ecx, 240 // if (B == rgbMax) eax = R - G; add = 240
@@7:
sub eax, edx
cvtsi2ss xmm0, eax
cvtsi2ss xmm1, ecx
mulss xmm0, _fc60
divss xmm0, xmm2
addss xmm0, xmm1 // H = eax * 60 / delta + add
comiss xmm0, _fc0
jae @@8
addss xmm0, _fc360
@@8:
pop eax
movss [eax], xmm0
@@Exit:
end; function HSVToColor(H, S, V: Single): TARGB;
asm
movss xmm1, H
comiss xmm1, _fc0
jae @@1
addss xmm1, _fc360
jmp @@2
@@1:
comiss xmm1, _fc360
jb @@2
subss xmm1, _fc360
@@2:
divss xmm1, _fc60
cvtss2si edx, xmm1 // index = Round(H)
cvtsi2ss xmm2, edx
subss xmm1, xmm2 // extra = H - index
comiss xmm1, _fc0 // if (extra < 0) // 如果index发生五入
jae @@3 // {
dec edx // index --
addss xmm1, _fc1 // extra ++
@@3: // }
test edx, 1
jnz @@4
movaps xmm2, xmm1
movss xmm1, _fc1
subss xmm1, xmm2 // if (index & 1 == 0) extra = 1 - extra
@@4:
movss xmm0, V
movss xmm2, S
minss xmm0, _fc1
minss xmm2, _fc1
maxss xmm0, _fc0
maxss xmm2, _fc0
mulss xmm0, _fc255
mulss xmm2, xmm0 // V * S
mulss xmm1, xmm2 // V * S * extra
pslldq xmm1, 4
movss xmm1, xmm2 // xmm1 = 0 0 V*S*E V*S
pshufd xmm0, xmm0, 0 // xmm0 = V V V V
subps xmm0, xmm1 // xmm0 -= mm1 = V V T P
jmp @@jmpTable[edx*4].Pointer
@@jmpTable: dd offset @@H60
dd offset @@H120
dd offset @@H180
dd offset @@H240
dd offset @@H300
dd offset @@H360
@@H360: // 300 - 359 (V, P, T)
pshufd xmm0, xmm0, 11100001b
jmp @@H60
@@H300: // 240 - 299 (T, P, V)
pshufd xmm0, xmm0, 11010010b
jmp @@H60
@@H240: // 180 - 239 (P, T, V)
pshufd xmm0, xmm0, 11000110b
jmp @@H60
@@H180: // 120 - 179 (P, V, T)
pshufd xmm0, xmm0, 11001001b
jmp @@H60
@@H120: // 60 - 119 (T, V, P)
pshufd xmm0, xmm0, 11011000b
@@H60: // 0 - 59 (V, T, P)
cvtps2dq xmm0, xmm0
packssdw xmm0, xmm0
packuswb xmm0, xmm0
movd eax, xmm0
or eax, 0ff000000h
end;

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

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

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

Delphi图像处理 -- RGB与HSV转换的更多相关文章

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

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

  2. OpenCV中RGB和HSV转换的问题

    1.一般情况下HSV模型各分量的取值范围为:H为0到360°,S为0到100%,V为0到255.但是在OpenCV中在由RGB转换到HSV的过程中,发现HSV中H为0到180°,S为0到255,V为0 ...

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

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

  4. [图像类名词解释][ RGB YUV HSV相关解释说明]

    一.概述 颜色通常用三个独立的属性来描述,三个独立变量综合作用,自然就构成一个空间坐标,这就是颜色空间.但被描述的颜色对象本身是客观的,不同颜色空间只是从不同的角度去衡量同一个对象.颜色空间按照基本机 ...

  5. 由RGB到HSV颜色空间的理解

    1. RGB模型 2. HSV模型 3. 如何理解RGB与HSV的联系 4. HSV在图像处理中的应用 5. opencv中RGB-->HSV实现 在图像处理中,最常用的颜色空间是RGB模型,常 ...

  6. HSV转换

    HSV中H为色调(Hue).S为饱和度(Saturation).V为亮度(Value)三个分量构成 RGB和HSV颜色空间中进行图像处理的案例,HSV颜色空间分离图像中每一个像素的值或V分量.这个分量 ...

  7. Atitit  rgb yuv  hsv HSL 模式和 HSV(HSB) 图像色彩空间的区别

    Atitit  rgb yuv  hsv HSL 模式和 HSV(HSB) 图像色彩空间的区别 1.1. 色彩的三要素 -- 色相.明度.纯度1 1.2. YUV三个字母中,其中"Y&quo ...

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

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

  9. Delphi图像处理 -- 最小值

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

随机推荐

  1. 2014年10月16号--for语句实例

    Console.WriteLine("一对小兔一个月之后长成大兔,再过一个月后生新的一对兔子,且两年之后有多少对兔子,就是三兔子幼兔,小兔,成兔"); Console.WriteL ...

  2. J2se中的声音---AudioPlayer

    1 package cn.gp.tools; import java.io.FileInputStream; import java.io.FileNotFoundException; import ...

  3. POJ2104 K-th Number 静态区间第k最值 平方分割

    干掉这道题的那一刻,我只想说:我终于**的AC了!!! 最终内存1344K,耗时10282ms,比起归并树.划分树以及其他各种黑科技,这个成绩并不算光彩⊙﹏⊙ 但至少,从最初的无数次TLE到最终的AC ...

  4. 用连接池提高Servlet访问数据库的效率

    Java Servlet作为首选的服务器端数据处理技术,正在迅速取代CGI脚本.Servlet超越CGI的优势之一在于,不仅多个请求可以共享公用资源,而且还可以在不同用户请求之间保留持续数据.本文介绍 ...

  5. php中文字符串反转

    <?php header("content-type:text/html;charset=utf-8"); /** 此函数的作用是反转中文字符串 mb_strlen() 获取 ...

  6. python自动开发之第十三天

    1.Paramiko模块下的demo.py程序     前面利用Python中的Paramiko模块可以进行SSH的连接,以及用来传送文件(SFTP),但是无论是哪一种方式,连接都是短暂的,并非是长连 ...

  7. Shell 控制并发

    方法1: #!/bin/bash c=0 for i in `seq -w 18 31`;do while [ $c -ge 3 ];do c=$(jobs -p |wc -w) sleep 1s d ...

  8. 开发DZ插件教程

    插件制作的基本思路是:(初学者适用)1.形成插件思路2.制作插件界面3.构架程序模块4.搭建存储数据5.填充功能语句6.检查应用错误7.完善插件功能 前言:为方便互联网数万Discuz!爱好者,更加深 ...

  9. UIProgressView

    UIProgressView顾名思义用来显示进度的,如音乐,视频的播放进度,和文件的上传下载进度等. 下面以一个简单的实例来介绍UIprogressView的使用. @interface Activi ...

  10. Ubuntu系统使用技巧

    ======================vbox 显示模式=====================right_ctrl+c     自动缩放right_ctrl_home  显示菜单====== ...