「日記2010年9月その3」の編集履歴(バックアップ)一覧に戻る
public partial class Form1 : Form { int tc = 0; //Bitmap lastB; public Form1() { InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e) { pictureBox2.Image = Image.FromFile("D:/色々/中高生向け戦争小説 ギガンダム討伐/tumblr_l0771pDcX01qbq8jdo1_500.jpg"); }
private void button1_Click(object sender, EventArgs e) { Bitmap b2 = new Bitmap(pictureBox1.Image); Bitmap b1 = new Bitmap (pictureBox1.Image); pictFilter PTC1 = new WindowsFormsApplication2.pictFilter(); //pictureBox1.Image=PTC1.HSVColorRound(b1, 30); //pictureBox2.Image =PTC1.Laplacian2(b1, PTC1.Laplacian(3, PTC1.GrayImage(b1))); pictureBox2.Image = PTC1.Laplacian(3, PTC1.GrayImage(b2)); pictureBox2.Image = PTC1.Laplacian2 (b1,b2) ;
} public static void ResultCallback(Bitmap outBit, PictureBox p1) { p1.Image = outBit;
}
private void pictureBox1_Click(object sender, EventArgs e) { tc++; pictureBox1.Top = 0; pictureBox1.Left = 0;
}
private void button2_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "画像ファイル(*.jpeg;*.jpg;*.gif)|*.jpeg;*.jpg;*.gif|すべてのファイル(*.*)|*.*"; if (ofd.ShowDialog() == DialogResult.OK) { pictureBox2.Image = Image.FromFile(ofd.FileName); } }
private void button3_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "画像ファイル(*.jpeg;*.jpg;*.gif)|*.jpeg;*.jpg;*.gif|すべてのファイル(*.*)|*.*"; if (ofd.ShowDialog() == DialogResult.OK) { pictureBox1.Image = Image.FromFile(ofd.FileName); } }
} class pictFilter {
public Bitmap HSVColorRound(Bitmap b1, int r) { Color C1; String s; Bitmap b2 = new Bitmap(b1.Width, b1.Height); HSV HSV1; double d; double MaxS=0; double d2=0; for (int i = 0; i < b1.Width; i++) { for (int j = 0; j < b1.Height; j++) { C1 = b1.GetPixel(i, j); HSV1 = HSVConvert.RGB2HSV(C1);
//d = (double)(HSV1.H + r) / 360.0; //HSV1.H =(int) Math.Round (d*(1-d)*4.0*360.0) % 360; //HSV1.H =( HSV1.H +r) % 360; HSV1.H = (HSV1.H + r) % 360; //d2=HSV1.S/255.0; //HSV1.S = (int)Math.Floor(d2 * (1.0 - d2) * 4.0 * 255.0); //HSV1.S /= 2;
//s = HSV1.ToString(); b2.SetPixel(i, j, HSVConvert.HSV2RGB(HSV1.H, HSV1.S, HSV1.V)); } } return b2; } public Bitmap Laplacian2(Bitmap bBitmap,Bitmap b2) {
int i, j; double count; int tempR; int tempG; int tempB; double tempR2, tempG2, tempB2; double tempRGB; Color C1, C2,C3; Bitmap b3=new Bitmap (bBitmap.Width ,bBitmap.Height); // 変数の宣言 iFilter : ラプラシアンフィルタ
// 画像に対するフィルタ処理 int size=4; int size2 = (2 * size + 1) * (2 * size + 1); double hiritu; double a; for (i = size; i < b2.Width - size; i++) {
for (j = size; j < b2.Height - size; j++) { count = 0; for (int k = -size; k < size+1; k++) {
for (int l = -size; l < size+1; l++) { tempR = b2.GetPixel(i + k, j + l).R; if (tempR > 128) { count++; } } } /* a= (size2 - count) / (size2 * (size2 - 1)); tempR2 =tempG2 =tempB2 = 0; hiritu = count / size2; double b=a*(size2-1) + hiritu; for (int k = -size; k < size+1; k++) {
for (int l = -size; l < size+1; l++) { C3 = bBitmap.GetPixel(i + k, j + l); if (k == 0 && l == 0) { tempR2 += (double)C3.R * hiritu ; tempG2 += (double)C3.G * hiritu ; tempB2 += (double)C3.B * hiritu; } else { tempR2 += (double)C3.R * a; tempG2 += (double)C3.G * a; tempB2 += (double)C3.B * a; }
} } tempR =(int)Math.Floor ( tempR2); tempG =(int) Math.Floor(tempG2); tempB = (int)Math.Floor(tempB2); C3 = Color.FromArgb(tempR, tempG, tempB); b3.SetPixel(i, j, C3); */ tempRGB=Math.Pow ((count) / ((2*size+1)*(2*size+1)),2); // フィルタ処理 C1 = bBitmap.GetPixel(i, j); C2 = b2.GetPixel(i, j);
tempR = (int)(Math.Floor(CutNum((double)C1.R * (1 - tempRGB ) + (double)255 * tempRGB))); tempG = (int)(Math.Floor(CutNum((double)C1.G * (1 - tempRGB ) + (double)255 * tempRGB))); tempB = (int)(Math.Floor(CutNum((double)C1.B * (1 - tempRGB ) + (double)255 * tempRGB))); C3=Color.FromArgb(tempR, tempG, tempB); b3.SetPixel(i, j, C3);
} } // フィルタ処理の結果の出力 return b3; //pictureBox1.Image = bBitmap; // 変更結果の設定
}
private double CutNum(double x){ if (x > 255) { x = 255; } if (x < 0) { x = 0; } return x; }
public Bitmap Laplacian(int iAmp,Bitmap bBitmap)
int i, j, iColorValue; // 変数の宣言 iColorValue : RGB平均値
// 変数の宣言 iFilter : ラプラシアンフィルタ
int[] iFilter = new int[]{-1, -1, -1, -1, 8, -1, -1, -1, -1};
// 変数の宣言 iArrayValue : ピクセル色情報の配列
int[,] iArrayValue = new int[bBitmap.Width, bBitmap.Height];
Color[] cArrayColor = new Color[9]; // 変数の宣言 cArrayColor : 色情報の配列
Color cSetColor; // 変数の宣言 cSetColor : 設定する色
// 画像に対するフィルタ処理
for(i = 1; i < bBitmap.Width - 1; i++)
for(j = 1; j < bBitmap.Height - 1; j++)
{ for(int k=-1;k<2;k++){ for(int l=-1;l<2;l++){ cArrayColor[(k + 1) * 3 + l + 1] = bBitmap.GetPixel(i+k,j+l); } } // フィルタ処理
iColorValue = iAmp*iColorValue; // 出力レベルの設定
// iColorValue が負の場合
if(iColorValue < 0)
iColorValue = -iColorValue; // 正の値に変換
// iColorValueが255より大きい場合
if(iColorValue > 255)
iColorValue = 255; // iColorValue を 255 に設定
iArrayValue[i, j] = iColorValue;// iColorValue の設定
}
// フィルタ処理の結果の出力
for (i = 1; i < bBitmap.Width - 1; i++)
for (j = 1; j < bBitmap.Height - 1; j++)
return bBitmap; //pictureBox1.Image = bBitmap; // 変更結果の設定
public Bitmap GrayImage (Bitmap bBitmap)
int iRed, iBlue, iGreen; int iAverage; Color cSetColor; Color cColor;
// 画像のグレースケールへの変換
for (int i = 0; i < bBitmap.Width; i++)
for (int j = 0; j < bBitmap.Height; j++) {
cColor = bBitmap.GetPixel(i, j); // ピクセルの色の取得
iRed = cColor.R; // Red 値の設定
iBlue = cColor.B; // Blue 値の設定
iGreen = cColor.G; // Green 値の設定
iAverage = (iRed + iBlue + iGreen) / 3;// RGB の平均値を算出
// iAverage 値による色の設定
cSetColor = Color.FromArgb(iAverage, iAverage, iAverage);
bBitmap.SetPixel(i, j, cSetColor); // ピクセルの色の設定
} return bBitmap; //pictureBox1.Image = bBitmap; // 変更結果の設定
struct HSV { public int H; public int S; public int V; }
class HSVConvert { //RGBをHSVに変換 public static HSV RGB2HSV(Color RGB) { HSV hsv = new HSV();
double max = Math.Max(Math.Max(RGB.R, RGB.G), RGB.B); double min = Math.Min(Math.Min(RGB.R, RGB.G), RGB.B);
//Vを求める hsv.V = (int)max;
//RGBすべてが同じ場合 HとSは0 if (max == min) { hsv.H = 0; hsv.S = 0; } else { //Sを求める hsv.S = (int)(((max - min) * 255) / max);
//Hを求める hsv.H = 0;
if (max == RGB.R) { hsv.H = (int)(60 * (RGB.G - RGB.B) / (max - min)); if (hsv.H < 0) hsv.H += 360; } else if (max == RGB.G) { hsv.H = (int)(60 * (2 + (RGB.B - RGB.R) / (max - min))); if (hsv.H < 0) hsv.H += 360; } else if (max == RGB.B) { hsv.H = (int)(60 * (4 + (RGB.R - RGB.G) / (max - min))); if (hsv.H < 0) hsv.H += 360; } }
return hsv; }
//HSVをRGBに変換 public static Color HSV2RGB(int H, int S, int V) {
if (H == 360) H = 0; int Hi = (int)Math.Floor((double)H / 60) % 6;
float f = ((float)H / 60) - Hi; float p = ((float)V / 255) * (1 - ((float)S / 255)); float q = ((float)V / 255) * (1 - f * ((float)S / 255)); float t = ((float)V / 255) * (1 - (1 - f) * ((float)S / 255));
p *= 255; q *= 255; t *= 255;
Color rgb = new Color();
switch (Hi) { case 0: rgb = Color.FromArgb(V, (int)t, (int)p); break; case 1: rgb = Color.FromArgb((int)q, V, (int)p); break; case 2: rgb = Color.FromArgb((int)p, V, (int)t); break; case 3: rgb = Color.FromArgb((int)p, (int)q, V); break; case 4: rgb = Color.FromArgb((int)t, (int)p, V); break; case 5: rgb = Color.FromArgb(V, (int)p, (int)q); break; }
return rgb; } } }