我有以下代码:
public List<Tuple<double, double, double>> GetNormalizedPixels(Bitmap image)
{
System.Drawing.Imaging.BitmapData data = image.LockBits(
new Rectangle(0, 0, image.Width, image.Height),
System.Drawing.Imaging.ImageLockMode.ReadOnly,
image.PixelFormat);
int pixelSize = Image.GetPixelFormatSize(image.PixelFormat) / 8;
var result = new List<Tuple<double, double, double>>();
unsafe
{
for (int y = 0; y < data.Height; ++y)
{
byte* row = (byte*)data.Scan0 + (y * data.Stride);
for (int x = 0; x < data.Width; ++x)
{
Color c = Color.FromArgb(
row[x * pixelSize + 3],
row[x * pixelSize + 2],
row[x * pixelSize + …
Run Code Online (Sandbox Code Playgroud) 我正在研究 CIELAB 色彩空间,但找不到有关 skimage.color.rgb2lab 生成的每个通道范围的任何信息。
谢谢。
我已经实现了几个函数来将sRGB转换为CIE-L*a*b*颜色空间.
现在,我想将它用于抖动,但我不确定如何准确地辨别哪种颜色是"较低"颜色,哪一种颜色是"较高"颜色.
当在一维色彩空间(灰度)中抖动时,事情很容易.当使用误差扩散抖动时,我从我的调色板计算最接近的灰度值,并将误差添加到周围的像素,这取决于我使用的抖动矩阵类型(例如Floyd-Steinberg).由于这是一维的,所以很简单,只有这一个值.但是现在我有了这个三维颜色空间,我应该单独将错误添加到每个坐标吗?
(在这一点上,这是对我有意义的唯一方法.)
当与有序抖动矩阵抖动时,事情变得更加复杂.有序抖动矩阵定义阈值.为此,我需要知道我的托盘的"较低"像素值和"较高"像素值,就我当前要抖动的像素而言.现在,我计算到两个像素的距离,来自抖动矩阵的阈值决定在那些与相邻像素之间的值之后,该像素被抖动到较低像素,或者抖动到较高像素.
(实际的实现当然会比计算,通过使用被明智地在我的托盘选择用于量灰度颜色值的矩阵更优化.此外,像具有均匀间隔的颜色值选择托盘等)
这再次 - 在一维色彩空间中非常容易.但在CIE-L*a*b*中,没有"更高"或"更低"的值.
仅使用亮度来应用阈值矩阵,看起来非常不正确,我的托盘中可能有两种颜色相同的亮度,那么呢?
在下面的代码中,我使用一个 4096*4096 像素的 png 图像,其中包括所有可能的 RGB 颜色(不是相同像素的两倍,可以在此处找到http://allrgb.com/starry-night)然后我将 RGB 值转换为LAB 值,我检查每个通道的范围
import cv2 as cv
import numpy as np
im=cv.imread('allrgb.png')
im=im.astype(np.uint8)
colors_lab=cv.cvtColor(im,cv.COLOR_BGR2LAB)
m=np.amin(colors_lab[...,...,0])
Run Code Online (Sandbox Code Playgroud)
结果如下:
如果原始图像的类型为 uint8,则 R[0,255],G[0,255],B[0,255] 给出 L[0,255],A[42,226],B[20,223]
如果原始图像的类型为 float32,则 R[0,1],G[0,1],B[0,1] 给出 L[0,100],A[-86.1813,98.2351],B[-107.862,94.4758]
无论如何,实验室范围从来都不是预期的范围,这是由开放的简历文档给出的
知道如何解释吗?
给定 RGB 或 Hex 颜色,如何找到与其相似的颜色?相似我的意思是它们应该通过小的值来区分。
使用 R 很容易RGB
将HEX
值转换为值:
x <- c("165 239 210", "111 45 93")
sapply(strsplit(x, " "), function(x)
rgb(x[1], x[2], x[3], maxColorValue=255))
#[1] "#A5EFD2" "#6F2D5D"
Run Code Online (Sandbox Code Playgroud)
如何将 CIELab 值转换为 RGB 和 HEX?
x <- c("20 0 0", "50 0 0")
[...code...]
#[1] "#303030" "#777777"
Run Code Online (Sandbox Code Playgroud) 我有以下脚本,它获取 RGB 图像并将其转换为 Lab 颜色空间:
\nimport tensorflow as tf\nimport tensorflow_io as tfio\n\nimg = tf.io.read_file(tf.keras.utils.get_file("tf", "https://upload.wikimedia.org/wikipedia/commons/e/e5/TensorFlow_Logo_with_text.png"))\nimg = tf.image.decode_png(img, channels=3)\nimg = tf.image.resize(img, [512, 512])\nlab = tfio.experimental.color.rgb_to_lab(img)\n\nlab = lab.numpy()\nlab.shape # (512, 512, 3)\n\nlab[:, :, 0].min() # 3660.3594\nlab[:, :, 0].max() # 9341.573\n\nlab[:, :, 1].min() # -49.76082\nlab[:, :, 1].max() # 4273.1514\n\nlab[:, :, 2].min() # -1256.8489\nlab[:, :, 2].max() # 6293.9043\n
Run Code Online (Sandbox Code Playgroud)\n\n\nLAB 空间是三维的,涵盖了人类色彩感知的整个范围或色域。它基于人类视觉的对手色模型,其中红色/绿色形成对手对,蓝色/黄色形成对手对。亮度值 L*,也称为“Lstar”,定义黑色为 0,白色为 100。a* 轴相对于 green\xe2\x80\x93red 对手颜色,负值朝向绿色,正值朝向绿色走向红色。b*轴代表蓝色\xe2\x80\x93黄色对手,负数朝向蓝色,正数朝向黄色。
\na* 和 b* 轴是无界的,并且根据参考白色,它们可以轻松超过 \xc2\xb1150 以覆盖人类色域。然而,出于实际原因,软件实现通常会限制这些值。例如,如果使用整数数学,通常会将 a* 和 b* …
cielab ×7
colors ×4
rgb ×4
python ×3
range ×2
scikit-image ×2
color-space ×1
dithering ×1
hex ×1
opencv ×1
r ×1
spyder ×1
tensorflow ×1