如何用opencv4nodejs中的另一个值替换某个RGB值的所有像素
How to replace all pixels of a certain RGB value with another value in opencv4nodejs
我为此使用了 opencv4nodejs 和 nodejs,
我正在尝试获取图像 RGB 值并替换特定索引中的特定 RGB 值并创建一个二维数组。
const color_map = [[255,255,0], [255,0,0], [0,255,255], [0,255,0], [0,0,0]];
const input_image = cv.imread("Data/IMG/train_labels/0.png");
let index = 0
function form_2D_label(mat) {
const image = mat.cvtColor(cv.COLOR_BGR2RGB);
const imageBuffer = mat.getData();
const ui8 = new Uint8Array(imageBuffer);
const imageData = new Array((image.rows * image.cols))
for (let i = 0; i < ui8.length; i += 3) {
imageData[index] = [ui8[i], ui8[i + 1], ui8[i + 2]];
for (const [index, element] of color_map.entries()) { // enumerate color map
// console.log(index, element);
// I am trying todo if imageData[index] value = [255, 255, 0] as 0, if [255, 0, 0] as 1, if [0, 255, 255] as 2 like this..
}
console.log(imageData[index]) // [255, 255, 0] / [255, 0, 0] like this
index++;
}
return imageData;
}
const test = form_2D_label(input_image);
console.log(test);
当前输出
[
[ 0, 0, 0 ], [ 255, 0, 0 ], [ 0, 0, 0 ], [ 255, 0, 0 ], [ 0, 0, 0 ],[255, 255, 0]
]
预计一个
[
[ 4, 1, 4, 1, 4, 0 ]
]
你的问题有点问题。
首先 color_map
只有 5 个元素,但预期结果的索引从 0 到 5(6 个元素),我认为这是一个错误,您只需要真正的索引。
第二个在你的代码中没有分配值 index
所以我假设,它是下一个可用的索引,并使用 push
属性 代替。
由于您实际上并不想要 return 多维数组,而只是索引的二维数组,因此 returning imageData
.[=15= 没有意义]
同意您在评论部分解释的条件,即颜色图值将是您可以尝试做的唯一事情:
const color_map = [[255,255,0], [255,0,0], [0,255,255], [0,255,0], [0,0,0]];
function form_2D_label(mat) {
const image = mat.cvtColor(cv.COLOR_BGR2RGB);
const imageBuffer = mat.getData();
const ui8 = new Uint8Array(imageBuffer);
const imageData = [];
for (let i = 0; i < ui8.length; i += 3) {
imageData.push([ui8[i], ui8[i + 1], ui8[i + 2]]);
console.log(imageData[imageData.length - 1])
}
return [imageData.map(el => color_map.findIndex(color => arrayEquals(color, el)))];
}
function arrayEquals(array1, array2) {
for (let i = 0, l = array2.length; i < l; i++) {
if (array2[i] !== array1[i]) return false;
}
return true;
}
我为此使用了 opencv4nodejs 和 nodejs,
我正在尝试获取图像 RGB 值并替换特定索引中的特定 RGB 值并创建一个二维数组。
const color_map = [[255,255,0], [255,0,0], [0,255,255], [0,255,0], [0,0,0]];
const input_image = cv.imread("Data/IMG/train_labels/0.png");
let index = 0
function form_2D_label(mat) {
const image = mat.cvtColor(cv.COLOR_BGR2RGB);
const imageBuffer = mat.getData();
const ui8 = new Uint8Array(imageBuffer);
const imageData = new Array((image.rows * image.cols))
for (let i = 0; i < ui8.length; i += 3) {
imageData[index] = [ui8[i], ui8[i + 1], ui8[i + 2]];
for (const [index, element] of color_map.entries()) { // enumerate color map
// console.log(index, element);
// I am trying todo if imageData[index] value = [255, 255, 0] as 0, if [255, 0, 0] as 1, if [0, 255, 255] as 2 like this..
}
console.log(imageData[index]) // [255, 255, 0] / [255, 0, 0] like this
index++;
}
return imageData;
}
const test = form_2D_label(input_image);
console.log(test);
当前输出
[
[ 0, 0, 0 ], [ 255, 0, 0 ], [ 0, 0, 0 ], [ 255, 0, 0 ], [ 0, 0, 0 ],[255, 255, 0]
]
预计一个
[
[ 4, 1, 4, 1, 4, 0 ]
]
你的问题有点问题。
首先 color_map
只有 5 个元素,但预期结果的索引从 0 到 5(6 个元素),我认为这是一个错误,您只需要真正的索引。
第二个在你的代码中没有分配值 index
所以我假设,它是下一个可用的索引,并使用 push
属性 代替。
由于您实际上并不想要 return 多维数组,而只是索引的二维数组,因此 returning imageData
.[=15= 没有意义]
同意您在评论部分解释的条件,即颜色图值将是您可以尝试做的唯一事情:
const color_map = [[255,255,0], [255,0,0], [0,255,255], [0,255,0], [0,0,0]];
function form_2D_label(mat) {
const image = mat.cvtColor(cv.COLOR_BGR2RGB);
const imageBuffer = mat.getData();
const ui8 = new Uint8Array(imageBuffer);
const imageData = [];
for (let i = 0; i < ui8.length; i += 3) {
imageData.push([ui8[i], ui8[i + 1], ui8[i + 2]]);
console.log(imageData[imageData.length - 1])
}
return [imageData.map(el => color_map.findIndex(color => arrayEquals(color, el)))];
}
function arrayEquals(array1, array2) {
for (let i = 0, l = array2.length; i < l; i++) {
if (array2[i] !== array1[i]) return false;
}
return true;
}