【C#】画像処理 ~ シャープネス ~

■ シャープネス(Sharpness)

 * 画像の輪郭(エッジ)をはっきりとする処理
https://kotobank.jp/word/%E3%82%B7%E3%83%A3%E3%83%BC%E3%83%97%E3%83%8D%E3%82%B9-4335

ラプラシアンフィルタ(Laplacian Filter)

https://imagingsolution.net/imaging/unsharpmasking/

■ サンプル

Formデザイン

 * PictureBox x 2 (元画像とシャープネス処理後の画像表示用)
  + SizeMode : AutoSize を設定
 * trackBar x 1 : シャープネス変更用スライダ
  + Maximum : 100 を設定

Form1.cs

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace SampleForm
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      pictureBox1.Image = new Bitmap(@"C:\sample.gif");

      float sharpness = (float) (trackBar1.Value / 100);
      pictureBox2.Image = AdjustSharpness(@"C:\sample.gif", sharpness);
    }

    public static Bitmap AdjustSharpness(String imagePath, float level)
    {
      Bitmap srcImg = new Bitmap(imagePath);
      Bitmap dstImg = new Bitmap(srcImg);

      BitmapData srcDat = srcImg.LockBits(
          new Rectangle(0, 0, srcImg.Width, srcImg.Height),
          ImageLockMode.ReadWrite,
          PixelFormat.Format32bppArgb);
      byte[] srcBuf = new byte[srcImg.Width * srcImg.Height * 4];
      Marshal.Copy(srcDat.Scan0, srcBuf, 0, srcBuf.Length);

      BitmapData dstDat = dstImg.LockBits(
          new Rectangle(0, 0, dstImg.Width, dstImg.Height),
          ImageLockMode.ReadWrite,
          PixelFormat.Format32bppArgb);
      byte[] dstBuf = new byte[dstImg.Width * dstImg.Height * 4];
      Marshal.Copy(dstDat.Scan0, dstBuf, 0, dstBuf.Length);

      for (int i = 1; i < srcImg.Height - 1; i++)
      {

        int dy1 = (i - 1) * (srcImg.Width * 4);
        int dy = i * (srcImg.Width * 4);
        int dy2 = (i + 1) * (srcImg.Width * 4);

        for (int j = 1; j < srcImg.Width - 1; j++)
        {
          int dx1 = (j - 1) * 4;
          int dx = j * 4;
          int dx2 = (j + 1) * 4;

          for (int k = 0; k < 3; k++)
          {
            int value = (int)((float)srcBuf[dy + dx + k] * (1f + level * 4))
                      - (int)((float)srcBuf[dy1 + dx + k] * level)
                      - (int)((float)srcBuf[dy + dx1 + k] * level)
                      - (int)((float)srcBuf[dy + dx2 + k] * level)
                      - (int)((float)srcBuf[dy2 + dx + k] * level);
            value = Math.Min(value, 255);
            value = Math.Max(value, 0);

            dstBuf[dy + dx + k] = (byte)value;
          }
        }
      }
      Marshal.Copy(dstBuf, 0, dstDat.Scan0, dstBuf.Length);
      dstImg.UnlockBits(dstDat);
      srcImg.UnlockBits(srcDat);
      return dstImg;
    }
  }
}



関連記事

画像処理

画像処理 ~ 輝度変更 (明るさ) ~
https://blogs.yahoo.co.jp/dk521123/37844934.html
画像処理 ~ コントラスト ~
https://blogs.yahoo.co.jp/dk521123/37852480.html
画像処理 ~ 回転 ~
https://blogs.yahoo.co.jp/dk521123/37853430.html
画像処理 ~ アフィン変換 ~
https://blogs.yahoo.co.jp/dk521123/38061211.html

その他

PictureBox ~画像を表示する~
https://blogs.yahoo.co.jp/dk521123/23504075.html
PictureBox [7] ~ 画像をコピーする ~
https://blogs.yahoo.co.jp/dk521123/37857445.html
C#】Graphics ~ 図形の描画 ~
https://blogs.yahoo.co.jp/dk521123/folder/966427.html