Ruby图片滤镜算法实现代码与核心原理
时间:2026-08-18 | 作者:电竞小硕 | 阅读:0来看一个很有意思的话题:怎么用代码给图片“整容”?准确地说,是图片的几种基础处理算法——灰度、二值化、底片和浮雕。这些方法在验证码识别、图像预处理、甚至一些复古滤镜里都特别常见。今天就用 Ruby 把这四种效果撸一遍,顺便聊聊背后的原理。
一、灰度算法
彩色图片的每个像素,其实是由红、绿、蓝三个通道值混合出来的。每个通道取值 0 到 255,排列组合一下,颜色总数就相当惊人。而灰度图片就简单多了——只有 256 种灰色,每个像素的 RGB 三个值相等。把这个“相等”的过程做好,就是灰度化的核心。
常用的灰度算法有三种:
- 最大值法:新的 RGB = Max(原R, 原G, 原B)。处理完图片会偏亮,因为只取了最亮通道。其实很少用。
- 平均值法:新的 RGB = (R+G+B)/3。效果柔和,但也偏“平”。
- 加权平均值法:新的 RGB = R×Wr + G×Wg + B×Wb。人眼对绿色最敏感,对蓝色最不敏感,所以绿色权重最高(59%),红色次之(30%),蓝色只有 11%。这才是最符合人类视觉的方案。
下面是用加权平均值法实现的 Ruby 代码:
#灰度化图片
#取RGB三色加权平均
def self.grey(bmp)
for i in 0 .. bmp.height - 1
for j in 0 .. bmp.width - 1
rgb = bmp.getRGB(i, j)
grey = (rgb.r.to_f * 0.3 + rgb.g.to_f * 0.59 + rgb.b.to_f * 0.11).to_i
bmp.setRGB(i, j, RGB.new(grey, grey, grey))
end
end
end
跑出来的灰度效果长这样:
二、二值化
二值化就更狠了——把所有像素的灰度值直接砍成 0 或 255,也就是纯黑和纯白。所有大于等于某个阈值的像素算作“目标”,设为 255;小于阈值的算作背景,设为 0。这种处理在验证码识别场景里几乎是标配。
实现起来也很直接:先算出一个全局阈值(通常是整张图片的平均灰度),然后遍历每个像素,亮于阈值的留白,暗于阈值的涂黑。
#二值化图片
#小于一定阈值设为0 0 0,大于设置为255 255 255
def self.binarization(bmp)
imageGreyLevel = bmp.getGreyLevel
for i in 0 .. bmp.height - 1
for j in 0 .. bmp.width - 1
rgb = bmp.getRGB(i, j)
if rgb.getGreyLevel < imageGreyLevel
bmp.setRGB(i, j, RGB.new(0, 0, 0))
else
bmp.setRGB(i, j, RGB.new(255, 255, 255))
end
end
end
end
二值化后的效果图:
三、底片
底片效果最好理解:每个通道值取反,255 减去原值就完事。红色变青色,绿色变品红,蓝色变黄色。原理简单,但视觉效果往往挺惊艳。
#底片化图片
#RGB取反色255-
def self.contraryColor(bmp)
for i in 0 .. bmp.height - 1
for j in 0 .. bmp.width - 1
rgb = bmp.getRGB(i, j)
bmp.setRGB(i, j, rgb.getContrary)
end
end
end
底片效果如下:
四、浮雕效果
浮雕的算法稍微绕点弯子。核心思想是用当前像素的 RGB 值减去相邻像素的 RGB 值,然后加上 128。为什么加 128?因为减法结果可能是负数,加 128 可以把结果拉回到 0~255 区间。
这个算法的奇妙之处在于:相邻像素的颜色通常很接近,相减后差异很小,结果会趋近 128(中灰色)。只有在颜色剧烈变化的边缘区域,减法结果才会明显偏离 128,从而形成凹凸感——这就是浮雕效果的视觉原理。
实际运行时,某些区域可能残留彩色条纹。解决办法很简单:对算出来的新 RGB 值再做一次灰度化处理,颜色就统一了。
#浮雕效果
#用当前点的RGB值减去相邻点的RGB值并加上128作为新的RGB值。
#处理之后,只有颜色的边沿区域会比较明显,平滑区域接近灰色,这样就具有了浮雕效果。
#最后对新的RGB值做一个灰度处理以消除彩色痕迹。
def self.emboss(bmp)
preRGB=RGB.new(128, 128, 128)
for i in 0 .. bmp.height - 1
for j in 0 .. bmp.width - 1
currentRGB=bmp.getRGB(i, j)
r = (currentRGB.r - preRGB.r) + 128
g = (currentRGB.g - preRGB.g) + 128
b = (currentRGB.b - preRGB.b) + 128
bmp.setRGB(i, j, RGB.new(r, g, b).getGreyRGB)
preRGB = currentRGB
end
end
end
最后看看浮雕效果:
四种基础图像处理算法,代码其实都不长,但背后的思路挺有启发性——尤其是加权灰度的人眼感知模拟和浮雕的邻域差分,这些思想在很多更复杂的图像处理任务里都能看到身影。
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- 使用RVM切换Ruby与Rails版本的实现方法
- 时间:2026-08-18
-
- Ruby语言是什么及入门使用方法
- 时间:2026-08-18
-
- Ruby on Rails网站项目搭建入门指南
- 时间:2026-08-18
-
- Ruby插入排序算法实现与二路插入排序代码示例
- 时间:2026-08-18
-
- Ruby中Hash哈希结构基本操作方法详解
- 时间:2026-08-18
-
- Ruby面向对象编程:类方法与类扩展详解
- 时间:2026-08-18
-
- Ruby正则表达式语法详解与常用示例代码
- 时间:2026-08-18
-
- Ruby二分搜索算法简单实现与查找示例
- 时间:2026-08-18
精选合集
更多大家都在玩
大家都在看
更多-
- 糖尿病完全不能吃糖吗
- 时间:2026-09-15
-
- 蚂蚁庄园小课堂2026年9月16日最新题目答案
- 时间:2026-09-15
-
- 小鸡答题今天的答案是什么2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园每日答题答案2026年9月16日
- 时间:2026-09-15
-
- 以下哪种粮食是酿造绍兴黄酒的主要原料 蚂蚁庄园今日答案9月16日
- 时间:2026-09-15
-
- 劝学名句“及时当勉励,岁月不待人”出自哪位诗人 蚂蚁庄园今日答案9.16
- 时间:2026-09-15
-
- 蚂蚁庄园今天答题答案2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园答题今日答案2026年9月16日
- 时间:2026-09-15



