Delphi图像处理 -- RGB与HSV转换
阅读提示:
《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转换的更多相关文章
- Delphi图像处理 -- RGB与HSL转换
阅读提示: <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM. <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...
- 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 ...
- Delphi图像处理 -- 文章索引
转载:http://blog.csdn.net/maozefa/article/details/7188354 本文对已发布<Delphi图像处理>系列文章进行索引链接,以方便阅读和查找. ...
- [图像类名词解释][ RGB YUV HSV相关解释说明]
一.概述 颜色通常用三个独立的属性来描述,三个独立变量综合作用,自然就构成一个空间坐标,这就是颜色空间.但被描述的颜色对象本身是客观的,不同颜色空间只是从不同的角度去衡量同一个对象.颜色空间按照基本机 ...
- 由RGB到HSV颜色空间的理解
1. RGB模型 2. HSV模型 3. 如何理解RGB与HSV的联系 4. HSV在图像处理中的应用 5. opencv中RGB-->HSV实现 在图像处理中,最常用的颜色空间是RGB模型,常 ...
- HSV转换
HSV中H为色调(Hue).S为饱和度(Saturation).V为亮度(Value)三个分量构成 RGB和HSV颜色空间中进行图像处理的案例,HSV颜色空间分离图像中每一个像素的值或V分量.这个分量 ...
- Atitit rgb yuv hsv HSL 模式和 HSV(HSB) 图像色彩空间的区别
Atitit rgb yuv hsv HSL 模式和 HSV(HSB) 图像色彩空间的区别 1.1. 色彩的三要素 -- 色相.明度.纯度1 1.2. YUV三个字母中,其中"Y&quo ...
- Delphi图像处理 -- 最大值
阅读提示: <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM. <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...
- Delphi图像处理 -- 最小值
阅读提示: <Delphi图像处理>系列以效率为侧重点,一般代码为PASCAL,核心代码采用BASM. <C++图像处理>系列以代码清晰,可读性为主,全部使用C ...
随机推荐
- delegate-使用笔记
public class testclass { public class ProductImages : Page { protected Repeater rptSmallUrls; protec ...
- IBM服务器 IMM日志收集
在IBM X系列服务器背板上有一个" SYS MGMT"接口,用网线将此接口与笔记本连接起来,然后将笔记本的 IP地址配置成 192.168.70.0/24 这个网段的地址,然后 ...
- linux如何开机以命令行形式启动?
在管理员权限下,修改/etc/inittab文件即可.把id:5:initdefault:改为id:3:initdefault:就可以了. 如下图所示: 图1: . 图2:
- 自动化工具word文档批量转html
企业有很多的科室,科室的每个人或多或少都会写一些文档,有些文档领导需要浏览,解决的办法是将编辑的文档打印出来,供领导浏览,或是为了节约企业成本,文档就在人与人这间或部门之间copy过来,copy过去. ...
- DEDECMS重要文件
DEDECMS 重要文件dedecms/include/common.inc.php全局变量文件dedecms/include/extend.func.php自定义函数文件
- [r]Setting up Django and your web server with uWSGI and nginx
Setting up Django and your web server with uWSGI and nginx This tutorial is aimed at the Django user ...
- 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 ...
- js实现
1,核心 ECMAScript 2,文档对象模型DOM 3,浏览器对象模型BOM
- iOS中浅淡UIApplication单例-b
在iOS的操作系统中 每一个程序都对应一个application单例,每一个application都对应一个Appdelegate代理,在代理中控制程序的各个状态.我们在程序中获取Applicatio ...
- C语言中的字节对齐以及其相关处理
首先,我们来了解下一些基本原理: 一.什么是字节对齐一个基本类型的变量在内存中占用n个字节,则该变量的起始地址必须能够被n整除,即: 存放起始地址 % n = 0,那么,就成该变量是字节对齐的;对于结 ...