- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
背景
为了练习(在 ruby 中),我正在实现一些颜色转换算法。我试图在 EasyRGB.com 上转换可用的伪代码到 ruby 。转换似乎工作正常。
根据 HSL color space theory红色恰好在 0 度,红色的色调范围约占色环的 60 度,从 -30 度到 30 度(这取决于人们想要将色轮划分的精细程度)。
(来源:med.sc.edu)
出于我的目的,我将轮子分成 6 个部分。与其他五个色相范围各占 60 度。
问题
当我尝试使用由我的转换函数生成的色调值时,我的计算偏离正 60 度。
根据颜色理论应该是什么结果
def hue_name_from_hue_value(hue_value)
color_angle = hue_value * 360
# still can't do grays
# saturation of 0 = gray
# lightness of 0 = black
# lightness of 1 = white
# there has to be a threshold for when it's considered white or black
# there has to be a threshold for when it's considered gray or the color in question
if 30 >= color_angle and color_angle < 90
return HUE_LIST[:YELLOW]
elsif 90 >= color_angle and color_angle < 150
return HUE_LIST[:GREEN]
elsif 150 >= color_angle and color_angle < 210
return HUE_LIST[:CYAN]
elsif 210 >= color_angle and color_angle < 270
return HUE_LIST[:BLUE]
elsif 270 >= color_angle and color_angle < 330
return HUE_LIST[:MAGENTA]
else
return HUE_LIST[:RED]
end
end
实际结果
def hue_name_from_hue_value(hue_value)
color_angle = hue_value * 360
if 30 >= color_angle and color_angle < 90
return HUE_LIST[:RED]
elsif 90 >= color_angle and color_angle < 150
return HUE_LIST[:YELLOW]
elsif 150 >= color_angle and color_angle < 210
return HUE_LIST[:GREEN]
elsif 210 >= color_angle and color_angle < 270
return HUE_LIST[:CYAN]
elsif 270 >= color_angle and color_angle < 330
return HUE_LIST[:BLUE]
else
return HUE_LIST[:MAGENTA]
end
end
问题
为什么我的转换关闭了 60 度(是否关闭了 60 度)?我已经包含了我实现 RGB 到 HSL 算法的源代码以供引用。
EasyRGB.com伪代码
var_R = ( R / 255 ) //RGB from 0 to 255
var_G = ( G / 255 )
var_B = ( B / 255 )
var_Min = min( var_R, var_G, var_B ) //Min. value of RGB
var_Max = max( var_R, var_G, var_B ) //Max. value of RGB
del_Max = var_Max - var_Min //Delta RGB value
L = ( var_Max + var_Min ) / 2
if ( del_Max == 0 ) //This is a gray, no chroma...
{
H = 0 //HSL results from 0 to 1
S = 0
}
else //Chromatic data...
{
if ( L < 0.5 ) S = del_Max / ( var_Max + var_Min )
else S = del_Max / ( 2 - var_Max - var_Min )
del_R = ( ( ( var_Max - var_R ) / 6 ) + ( del_Max / 2 ) ) / del_Max
del_G = ( ( ( var_Max - var_G ) / 6 ) + ( del_Max / 2 ) ) / del_Max
del_B = ( ( ( var_Max - var_B ) / 6 ) + ( del_Max / 2 ) ) / del_Max
if ( var_R == var_Max ) H = del_B - del_G
else if ( var_G == var_Max ) H = ( 1 / 3 ) + del_R - del_B
else if ( var_B == var_Max ) H = ( 2 / 3 ) + del_G - del_R
if ( H < 0 ) H += 1
if ( H > 1 ) H -= 1
}
我在 Ruby 中实现的伪代码
def rgb_to_hsl(red, green, blue)
hsl_values = {:hue => 0, :saturation => 0, :lightness => 0}
if
(red.is_a?(Integer) && green.is_a?(Integer) && blue.is_a?(Integer)) == false
return hsl_values
end
red /= 255.to_f
green /= 255.to_f
blue /= 255.to_f
hue = 0.to_f
saturation = 0.to_f
lightness = 0.to_f
minimum = [red, green, blue].min
maximum = [red, green, blue].max
delta_max = maximum - minimum
lightness = (maximum + minimum) / 2
if delta_max == 0 #gray
hue = 0
saturation = 0
else
if lightness < 0.5
saturation = delta_max / (maximum + minimum)
else
saturation = delta_max / (2 - maximum - minimum)
end
delta_red = (((maximum - red) / 6) + (maximum / 2)) / delta_max
delta_green = (((maximum - green) / 6) + (maximum / 2)) / delta_max
delta_blue = (((maximum - blue) / 6) + (maximum / 2)) / delta_max
if red == maximum
hue = delta_blue - delta_green
elsif green == maximum
hue = (1 / 3) + delta_red - delta_blue
elsif blue == maximum
hue = (2 / 3) + delta_green - delta_red
end
if hue < 0
hue += 1
end
if hue > 1
hue -= 1
end
end
hsl_values[:hue] = hue
hsl_values[:saturation] = saturation
hsl_values[:lightness] = lightness
return hsl_values
end
最佳答案
在对 Ruby 语言进行一些研究后,我找到了问题的答案。
首先,我遇到了一个舍入错误,因为我的一些计算没有进行 float 学运算。我通过将 to_f
方法附加到需要的整数来解决这些问题。
其次,我确定色调的逻辑有误。我找到了 between?(a, b)
方法并将其替换为我编写的等式。这解决了问题。
重写后的代码如下。
def hue_name_from_hue_value(hue_value)
color_angle = hue_value * 360
if color_angle.between?(31, 90)
return HUE_LIST[:YELLOW]
elsif color_angle.between?(91,150)
return HUE_LIST[:GREEN]
elsif color_angle.between?(151,210)
return HUE_LIST[:CYAN]
elsif color_angle.between?(211,270)
return HUE_LIST[:BLUE]
elsif color_angle.between?(271,330)
return HUE_LIST[:MAGENTA]
else
return HUE_LIST[:RED]
end
end
关于algorithm - RGB => HSL => 色调范围名称转换算法关闭正 60 度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27451695/
我拦截了一个数据包并提取了有效载荷。此有效负载是压缩的 jpeg 字节流数据(例如,将此数据分配给 unsigned char *payload )。我知道如果我有一个 FILE 指针,那么我可以使用
假设我们有一个单 channel 图像 (5x5) A = [ 1 2 3 4 5 6 7 8 9 2 1 4 5 6 3 4 5 6 7 4 3 4
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 2 年前。 Improve th
我有一个 RGB LED 并且有 9、10、11 的引脚和接地的引脚。已为 R、G 和 B 提供电阻器。 当我这样做时: analogWrite(r, 255); // I see a red c
我想知道如何从像素中获取颜色作为 RGB 整数,并在需要时进行转换。另外,如何利用差异来确定一个像素是否比另一个像素更亮或更暗。 最佳答案 简单: rgb_int = rgb_tuple[0] <<
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 3 年前。 Improve
我的目标是找到与数组中的 RGB 相比最接近的 RGB 匹配项。我已经创建了一个循环遍历图片中每个像素的函数。我现在唯一需要做的就是找到图片中每个像素最接近数组颜色的颜色。 $colors = arr
将 YUV 文件转换为 RGB 文件时出现问题。完成后,我无法使用 GIMP 或其他查看器打开 .rgb 文件,但我成功打开下载的 .rgb 文件。请告诉我RGB文件的结构是什么? (它是否包含标题?
我正在开发一个程序,在该程序中我获取图像的一部分并计算该图像的平均 RGB。当我计算它时,我得到完全不同的值,就好像我要使用内置函数一样。当我测试我的数字并将它们放入 RGB 颜色图表时,它们会关闭,
我正在尝试无损压缩图像,为了利用规律性,我想将图像从 RGB 转换为 Y'CbCr。 (我所说的 RGB 和 Y'CbCr 的具体细节在这里并不重要;RGB 数据由三个字节组成,我有三个字节来存储结果
我有一个应用程序可以生成一堆 jpg,我需要将这些 jpg 转换为 webm 视频。我正在尝试将 jpeg 中的 rgb 数据放入 vpxenc 示例中。我可以在输出视频中看到原始 jpg 的基本形状
我不太熟悉位移位,所以我有以下问题。我使用下面的函数(在别处找到)从 YUV 解码为 RGB int 数组。 现在我想调整红色或绿色或蓝色值来创建一些自定义滤镜效果。我需要检索 R 值、G 值和 B
在下面的代码片段中,我试图在 Visual C++ 中检索像素的 RGB 值,然后将相同的 RGB 值设置回相同的像素。也就是说,这只是一个测试。但是,当我这样做时,生成的图像相似但颜色错误/关闭。生
我试图在 上将 RGB 颜色从蓝色 (rgba(0,0,255)) 转换为红色 (rgba(255,0,0)) >JS mouseenter,渐进式。 因此,每次鼠标进入一个元素时,它都会“增加”其背
我需要根据像素的 RGB 颜色创建一个 Color 对象(读取 PNG 文件的 BufferedImage 对象,BufferedImage 颜色空间为 BufferedImage.TYPE_4BYT
我正在编写一段代码,它必须从 RGB 图像转换为 rgb 标准化空间。我已经使用 for 格式使用它,但它运行速度太慢,我需要评估大量图像。我正在尝试矢量化完整功能以加快它的速度。我现在有以下内容:
我想在多种光照条件下获取图像的 RGB 值。为了获得某种中性场景,我想使用一些预定义图像的 RGB 值对 RGB 值进行归一化。 让我解释一下。我有 6 张预定义图像,我知道它们的确切平均 RGB 值
将平行四边形((RGB)点的二维数组)投影到三角形((RGB)点的二维数组)(在我的特定情况下,将矩形投影到具有相同边长的直角三角形)的伪代码算法是什么(等腰),在我的例子中,斜边的大小与矩形的最大边
假设我有一张摄影底片扫描为 RGB 图像,我正试图找到一种算法将颜色值转换为 RGB 正片。 由于橙色偏差 (http://photo.net/learn/orange-negative-mask),
我已成功将图像转换为灰度图像,我想将灰度图像恢复为 RGB 图像。请帮忙。提前致谢。 -(UIImage *) toGrayscale { const int RED = 1;
我是一名优秀的程序员,十分优秀!