【整点没用的】古法图像处理
使用Jimp进行简单图像处理
由于种种原因,最近看了一点数字图像处理。由于只会js,所以准备用jimp这个可以进行简单图片处理的库来玩一玩。
本文不涉及数字图像处理概念,只介绍一个例子将图片和背景进行拆分。
0.准备
首先准备一张图片,这里用的是ai生成的。
然后准备一个vue3的空白工程项目,后续用它展示提取到的像素信息。
1.提取原始图片信息
通过ai给的例子对图片信息进行提取(这里偷懒直接通过main.js写到windows里)
import { createApp } from "vue"; import App from "./App.vue"; import router from "./router"; import { Jimp } from "jimp"; import { intToRGBA } from "jimp"; // 定义特性标志 window.__VUE_PROD_DEVTOOLS__ = false; window.__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ = false; window.demopath = "https://file.fishpi.cn/2025/03/解析数据-c8b76329.png?imageView2/2/w/768/format/webp/interlace/1"; window.outputpath = "output.jpg"; // danger 获取demo图片数据 Jimp.read(window.demopath) .then((image) => { // 获取图片的宽度和高度 const width = image.bitmap.width; const height = image.bitmap.height; window.demoWidth = width; window.demoHeight = height; // 遍历每一个像素点 const data = []; for (let y = 0; y < height; y++) { for (let x = 0; x < width; x++) { // 获取当前像素点的颜色值(以 32 位整数表示) const color = image.getPixelColor(x, y); // 将 32 位整数颜色值转换为 RGBA 对象 const rgba = intToRGBA(color); const hexColor = `#${rgba.r.toString(16).padStart(2, "0")}${rgba.g .toString(16) .padStart(2, "0")}${rgba.b.toString(16).padStart(2, "0")}`; data.push({ x, y, rgba, color, hexColor, }); } } window.demoData = data; }) .catch((err) => { console.error("读取图片时出现错误:", err); }); createApp(App).use(router).mount("#app");
2.颜色列表统计
这是一张1024*1024的图片,所以一共有1,048,576个像素点,也就是1,048,576个像素信息。从图片看显而易见里面有大量相同颜色的像素点,我需要对其进行统计。
/** * 统计像素 */ export function collectColors(dataArray) { const colorInfo = {}; for (let i = 0; i < dataArray.length; i++) { const color = dataArray[i].color; const hexColor = dataArray[i].hexColor; if (colorInfo[color]) { colorInfo[color].count++; } else { colorInfo[color] = { count: 1, hexColor, }; } } return sortObjectByCount(colorInfo); } function sortObjectByCount(obj) { // 将对象转换为数组,数组元素为 [key, value] 形式 const entries = Object.entries(obj); // 根据 count 值对数组进行排序 const end = entries.sort((a, b) => b[1].count - a[1].count); // 将排序后的数组转换回对象 return end; }
最后这就是我得到的像素统计信息,其中中间的数字代表统计数量:
3.手动色值处理
这里收集到了色值信息,现在我根据背景色颜色对图像进行处理,首先尝试第一个最多的色值,将其替换为黑色。
// import { Jimp } from "jimp"; const { Jimp } = require("jimp"); const demopath = "https://file.fishpi.cn/2025/03/解析数据-c8b76329.png?imageView2/2/w/768/format/webp/interlace/1"; const output = "output.jpg"; async function modifyPixelGloble(aim = []) { try { // 读取图片 // const image = await Jimp.read(window.demopath); const image = await Jimp.read(demopath); const width = image.bitmap.width; const height = image.bitmap.height; // 遍历指定区域内的像素 for (let x = 0; x < width; x++) { for (let y = 0; y < height; y++) { // 获取当前像素点的颜色值(以 32 位整数表示) const color = image.getPixelColor(x, y); aim.map((item) => { if (Number(item) == color) { // 设置新的像素颜色 image.setPixelColor(4278190080, x, y); } }); } } // 保存修改后的图片 await image.write(output); console.log("图片修改并保存成功"); } catch (error) { console.error("处理图片时出错:", error); } } modifyPixelGloble([ 237124863 ]);
初步处理后:
这里能明显看到背景色替换了部分,再加深处理最后得到这样的结果:
4.总结
对于这样背景分明的图片可以很方便的通过色值判断来进行背景处理,但是总会有更复杂的图像,所以这样的操作并不具备普适性,仅仅是学习的一个过程记录。代码将看心情同步于github。
此外通过ai也能进行简单提取,比如提取草地部分内容:
当进行更复杂或更深度的处理,免费ai就会生成一些无关的图片,目前使用ai想精确控制处理方向和处理结果还是有困难的。
-
JavaScript
-
图像处理
不愧是猫猫大佬
佬
大佬!
戴佬
猫老师带我
看不懂,但是吊
看不懂,但是吊
已阅
不愧是猫老师,带带我
佬
好大力出奇迹的算法
返璞归真,大道至简,有没有觉得我很厉害呢😋
等我精通
那我命令你精通一揽子数学知识
多看几遍就懂了
古法编程
大佬喵
羡慕你,长得刷能力强
6
1
1
真是太厉害了喵(捧读)
6
古法嘟嘟煲,不好吃