ホームページ  >  記事  >  バックエンド開発  >  Rubyで実装された画像フィルタアルゴリズムコード

Rubyで実装された画像フィルタアルゴリズムコード

小云云
小云云オリジナル
2017-12-05 14:38:251672ブラウズ

フィルターは現在私たちの生活の中で広く使用されており、この記事では、グレースケール、バイナリ、ネガ、レリーフなど、Ruby を使用して実装されたいくつかの画像フィルター アルゴリズムについても説明します。とてもシンプルで実用的なので、困っている友達が参考にすることができます。

元の画像


1. グレースケールアルゴリズム

カラー写真の各ピクセルの色の値は、赤、緑、青の混合であり、赤、緑、青の値が分割されます。これはカラー画像の原理ですが、グレースケール写真は 3 つの RGB チャネル値を設定します。画像のカラー値が同じになると、画像はグレーで表示されます。

グレースケール処理には一般に 3 つのアルゴリズムがあります:

  1. 最大値法: つまり、新しい色の値 R=G=B=Max(R, G, B) は、この方法で処理された画像の明るさに似ています。値が偏っています。

  2. 平均法: 新しい色の値 R=G=B=(R+G+B)/3、この方法で処理された画像はとても柔らかいです

  3. 加重平均法: 新しい色の値R=G=B = (R * Wr + G * Wg + B * Wb) 一般に、人間の目は色ごとに異なるため、3 つの色の重みは異なります。値は Wr = 30%、Wg = 59%、Wb = 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

グレースケール効果:


2. 画像の二値化とは、画像上のピクセルのグレー値を 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

二値化の効果


3. ネガティブ

ネガティブな効果の実現は非常に簡単です。各RGBチャンネルの値を反転するには、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

ネガティブ効果


4を減算します。救済のアルゴリズムは比較的複雑です。現在のRGB値を使用します。減算するポイント 隣接するポイントの RGB 値を削除し、新しい RGB 値として 128 を追加します。画像内の隣接する点の色の値は比較的近いため、このようなアルゴリズム処理の後、色のエッジ領域、つまり隣接する色の違いが大きい部分の結果のみがより明白になり、他の部分は滑らかになります。領域は同じ色の値を持ちません。それらはすべて灰色である約 128 に近いため、

には緩和効果があります。

実際の効果では、この処理後も一部の領域に「カラー」のドットやストリップが残る可能性があるため、新しい RGB 値に対してグレースケール処理を実行するのが最善です。


#浮雕效果
 #浮雕的算法相对复杂一些,用当前点的RGB值减去相邻点的RGB值并加上128作为新的RGB值。由于图片中相邻点的颜色值是比较接近的,
 #因此这样的算法 处理之后,只有颜色的边沿区域,也就是相邻颜色差异较大的部分的结果才会比较明显,而其他平滑区域则值都接近128左右,
 #也就是灰色,这样就具有了浮雕效果。
 #在实际的效果中,这样处理后,有些区域可能还是会有”彩色”的一些点或者条状痕迹,所以最好再对新的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)*1+128
    g=(currentRGB.g - preRGB.g)*1+128
    b=(currentRGB.b-preRGB.b)*1+128

    bmp.setRGB(i, j, RGB.new(r,g,b).getGreyRGB)
    preRGB = currentRGB
   end
  end

 end

エンボス効果

上記の内容は、Ruby で実装された画像フィルター アルゴリズム コードについてです。
関連する推奨事項:

CSS フィルターの詳細な紹介について説明します

フィルター効果の CSS3 実装の詳細な例

画像フィルター効果を実装するための HTML5 サンプル コードの共有

以上がRubyで実装された画像フィルタアルゴリズムコードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。