■ シャープネス(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; } } }
参考文献
http://www.84kure.com/blog/2014/12/05/c-%E7%94%BB%E5%83%8F%E3%81%AE%E3%82%B7%E3%83%A3%E3%83%BC%E3%83%97%E3%83%8D%E3%82%B9%E3%82%92%E5%BC%B7%E8%AA%BF%E3%81%99%E3%82%8B-%E7%B2%BE%E9%8B%AD%E5%8C%96/https://algorithm.joho.info/programming/csharp-sharpness-filter/
http://csharpimage.blog60.fc2.com/blog-entry-6.html