- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的目标是拍摄图像,将其转换为 LAB 色彩空间,然后仅在亮度 channel 上应用自定义查找表并显示它。 LUT 将应用从蓝色到红色的渐变 - 因此我的输出图像将以红色显示图像最亮的部分,以蓝色显示最暗的部分。
void MainWindow::convertBGRMatToLAB(const cv::Mat inputMat)
{
// Create lookup table (LUT)
cv::Mat lookupTable(1, 256, CV_8UC(3));
for (int i=0; i<256; i++)
{
lookupTable.at<cv::Vec3b>(i)[0]= 255-i; // first channel (B)
lookupTable.at<cv::Vec3b>(i)[1]= 0; // second channel (G)
lookupTable.at<cv::Vec3b>(i)[2]= 255+i; // ... (R)
}
// Convert to LAB color space.
cv::Mat convertedLAB;
cv::cvtColor(inputMat, convertedLAB, CV_BGR2Lab);
// Isolate the L, A, B channels.
cv::Mat convertedLABSplit[3];
cv::split(convertedLAB, convertedLABSplit);
// Apply our custom lookup table to L channel.
cv::Mat outputMat(inputMat.rows, inputMat.cols, CV_8UC3);
cv::LUT(convertedLABSplit[0], lookupTable, outputMat); // Program crashes here.
//cv::LUT(inputMat, lookupTable, outputMat); // This works (but not what I am looking to do).
// Show the output image
cv::imshow("Output Image", outputMat);
}
但是当我运行我的 (Qt) 应用程序时,我收到 Microsoft Visual C++ 运行时库调试错误:
和:
OpenCV Error: Assertion failed ((lutcn == cn || lutcn == 1) && _lut.total() == 256 && _lut.isContinuous() && (depth == 0 || depth == 1)) in cv::LUT, file C:\OpenCV\3.4.0\source\opencv-3.4.0\modules\core\src\convert.cpp, line 4552
我认为问题与将 LUT 应用于单 channel 图像有关,因为如果我将 LUT 仅应用于输入图像,上面的代码就会运行。所以不是:
cv::LUT(convertedLABSplit[0], lookupTable, outputMat);
我把它改成:
cv::LUT(inputMat, lookupTable, outputMat);
但我想将我的 LUT 仅应用于 LAB 色彩空间中的 L channel ,并丢弃 A 和 B channel 。
问题是否与我创建 LUT 的方式有关?我应该如何为单 channel 图像创建这样的 LUT?
最佳答案
感谢@Dan Mašek 上面的评论。我将其添加为此处的答案,以便可以将问题标记为已回答。
For a 3 channel lookup table, the input also needs to be 3 channel. Just merge 3 copies of the L channel back into a 3 channel Mat, and apply the LUT to the result.
更新代码:
void MainWindow::convertLightToDarkColorMap(const cv::Mat inputMat)
{
// Create lookup table (LUT)
cv::Mat lookupTable(1, 256, CV_8UC(3));
for (int i=0; i<256; i++)
{
lookupTable.at<cv::Vec3b>(i)[0]= 255-i; // first channel (B)
lookupTable.at<cv::Vec3b>(i)[1]= 0; // second channel (G)
lookupTable.at<cv::Vec3b>(i)[2]= 255+i; // ... (R)
}
// Convert to LAB color space.
cv::Mat convertedLAB;
cv::cvtColor(inputMat, convertedLAB, CV_BGR2Lab);
// Isolate the L, A, B channels.
cv::Mat convertedLABSplit[3];
cv::split(convertedLAB, convertedLABSplit);
// 3 channel LUT only works on a 3 channel input. So take (3) copes of the L channel and merge them into one.
cv::Mat trippleL;
std::vector<cv::Mat> trippleLArr;
trippleLArr.push_back(convertedLABSplit[0]);
trippleLArr.push_back(convertedLABSplit[0]);
trippleLArr.push_back(convertedLABSplit[0]);
cv::merge( trippleLArr, trippleL);
// Apply our custom lookup table to L channel.
cv::Mat outputMat(inputMat.rows, inputMat.cols, CV_8UC3);
cv::LUT(trippleL, lookupTable, outputMat);
// Show the output image
cv::imshow("Output", outputMat);
}
关于c++ - 在单 channel 图像上应用 openCV 查找表 (LUT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58791286/
我需要将 LUT 从 Android 应用程序传递到 fragment 着色器以进行颜色校正。我发现了一些将 LUT 作为位图传递的示例 GLES20.glBindTexture(GLES20.GL_
import numpy as np, itertools x1 = np.linspace(0.1, 3.5, 3) x2 = np.arange(5, 24, 3) x3 = np.arange(
假设我有 8 个表,每张表有 16 个值: uint32_t lut[8][16]; 我想用值填充这些表,以便组合(add、eor 等等)八个表中每个表中的一个条目将产生一个唯一的 32 位值 - 与
目前我计算日志如下: #define MAXLOG 1001 double myloglut[MAXLOG]; void MyLogCreate() { int i; double e
我们正在尝试编写一种方法来从 LUT 的链表实现中删除具有特定键的节点。 我写的代码总结: public void delete (String k) { Node currNode = li
void LUT(InputArray src, InputArray lut, OutputArray dst, int interpolation=0 ) 根据查找表在8位数组中进行替换,并将结果
我正在生成一个 LUT,将 0-2PI 分成 512 个片段,然后找到这些值的正弦并将它们存储为 Q1.31 值。 例子: LUT[0] = 0 LUT[1] = sin((1/512) * 2*PI
我正在编写一些颜色管理代码,并且正在处理 LUT(查找表)。 我可以读取颜色配置文件 LUT 并转换我的值...但是,我该如何进行逆运算?也许,是否有一个好的算法来生成 LUT 的“逆”? 最佳答案
在我正在编写的 C++ CPU 绑定(bind)模拟中,我通过程序中的 valgrind 将瓶颈追踪到 cmath::exp。它目前占用了我 40% 以上的模拟时间。我可以将输入绑定(bind)到一个
假设我需要为 0...255 个值创建一个包含预先计算的位计数值(数字中 1 位的计数)的 LUT: int CB_LUT[256] = {0, 1, 1, 2, ... 7, 8}; 如果我不想使用
我的问题与这些术语之间的区别和关系有关: LUT 逻辑单元 逻辑元件(LE) 系统门 我知道这在很大程度上取决于 FPGA 生产商,但例如 FPGA 供应商将其产品之一描述为:具有 100.000 S
我有 500 个帧,我将每个帧的长度存储在数组中,因为帧按升序排列。 const char header_length = {23,34, 45, 12, 23,56,......,2,4}; 这里帧
我需要对图像中的所有像素执行幂指数运算。这是一个非常繁重的过程。指数是常量( float ),底数是 uint32_t(乘以 2 uint16_t 的结果)我正在尝试弄清楚我是否可以编写一个 LUT,
我目前正致力于在 C 语言中建立一个框架,以便在多个微 Controller 之间使用。该框架必须承载所有设备特定代码,因此应用程序仅包含外设的抽象用法(如 SerialPort_Read、write
我的程序中需要一个查找表来描述不同类型的大小。现在我明白了: typedef struct{ APP_InterfaceType_t Type; //This is just an enu
我有一些代码可以创建一个看起来大致像这样的 HSV 掩码(取自 this Japanese-language page ): void colorExtraction(const cv::gpu::G
需要对图像的颜色 channel 应用一些快速转换。 1)我已经在列表中存储了相应的输出值: ListaVred = [0]*255 for i in range(0,255): ListaV
对于我的工作,我需要将 JPG 中的伪彩色 RGB 值替换为灰度以进行处理。 “颜色”图像具有特定范围的 RGB 颜色(20 或 255,取决于来源)需要链接到灰度值以便对输出图像进行一些测量。使用原
我正在尝试编写一个快速的 3D lut 查找函数并注意到大多数 lut 是 33x33x33 或 17x17x17。 为什么是 33 或 17?用 32 或 16 代替数学不是更快吗?所以你可以做一些
我是图像处理的新手。 我想使用 JavaScript 对使用 LUT(查找表)或相应的查找 PNG 的图像应用效果,如下所示: 我在谷歌上搜索了很多,但找不到一篇文章或任何资源来描述使用 LUT 进行
我是一名优秀的程序员,十分优秀!