前提・実現したいこと
C#で元画像をガウシアンフィルタでフィルタ処理した後に、二値化するという作業をしています。
フィルタ機能を実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
名前'Filter'は現在のコンテキスト内に存在しません。
該当のソースコード
C#
1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Text; 7using System.Windows.Forms; 8using System.IO; 9using System.Drawing.Imaging; 10using System.Linq; 11 12namespace 二値化とサイズ変更 13{ 14 public partial class Form1 : Form 15 { 16 public Form1() 17 { 18 InitializeComponent(); 19 } 20 21 Bitmap bmp1_im1;//資料画像(原画像)のビットマップ 22 Bitmap bmp1_im2;//資料画像(二値化後)のビットマップ 23 Bitmap bmp1_im3;//資料画像(フィルタ処理後)のビットマップ 24 25 PictureBox pb1, pb2, pb3; 26 27 private void Form1_Load(object sender, EventArgs e) 28 { 29 pb1 = pictureBox1; 30 pb2 = pictureBox2; 31 pb3 = pictureBox3; 32 33 } 34 35 private void File_Open_Click(object sender, EventArgs e) 36 { 37 if (openFileDialog1.ShowDialog() == DialogResult.OK) 38 { 39 Image im1 = Image.FromFile(openFileDialog1.FileName); 40 DrawPicture1(im1); 41 } 42 } 43 44 private void DrawPicture1(Image im1) 45 46 { 47 double a; 48 int maxsize = 200; 49 50 if (im1.Width < maxsize && im1.Height < maxsize) 51 { 52 pb1.Width = pb1.Height = maxsize; 53 Rectangle rect1 = new Rectangle(0, 0, im1.Width, im1.Height);//イメージのサイズ 54 Rectangle rect2 = new Rectangle(0, 0, pb1.Width, pb1.Height);//PictureBox1のサイズ 55 bmp1_im1 = new Bitmap(pb1.Width, pb1.Height); 56 Graphics g = Graphics.FromImage(bmp1_im1); 57 g.DrawImage(im1, rect2, rect1, GraphicsUnit.Pixel); 58 g.Dispose(); 59 pb1.Image = bmp1_im1; 60 } 61 else 62 { 63 if (im1.Width > im1.Height) 64 { 65 /*a = (double)maxsize / (double)im1.Width;*/ 66 pb1.Width = maxsize; 67 pb1.Height = maxsize /* (int)(a * im1.Height)*/; 68 } 69 else 70 { 71 /*a = (double)maxsize / (double)im1.Height;*/ 72 pb1.Height = maxsize; 73 pb1.Width =maxsize /*(int)(a * im1.Width)*/; 74 } 75 Rectangle rect3 = new Rectangle(0, 0, im1.Width, im1.Height);//イメージのサイズ 76 Rectangle rect4 = new Rectangle(0, 0, pb1.Width, pb1.Height);//PictureBox1のサイズ 77 bmp1_im1 = new Bitmap(pb1.Width, pb1.Height); 78 Graphics g = Graphics.FromImage(bmp1_im1); 79 g.DrawImage(im1, rect4, rect3, GraphicsUnit.Pixel); 80 g.Dispose(); 81 pb1.Image = bmp1_im1; 82 } 83 } 84 85 private void File_SaveBMP_Click(object sender, EventArgs e) 86 { 87 if (saveFileDialog1.ShowDialog() == DialogResult.OK) 88 { 89 pb2.Image.Save(saveFileDialog1.FileName, ImageFormat.Bmp); 90 } 91 } 92 93 private void P_GrayScale_Click(object sender, EventArgs e) 94 { 95 int i, j, nx, ny; 96 int gray; 97 Color col; 98 nx = pb3.Width; 99 ny = pb3.Height; 100 bmp1_im2 = new Bitmap (pb3.Image); 101 for (j = 0; j < ny; j++) 102 for (i = 0; i < nx; i++) 103 { 104 col = bmp1_im2.GetPixel(i, j); 105 if (col.R > 200 && col.B > 200 && col.G > 200) gray = 255; 106 else gray = 0; 107 bmp1_im2.SetPixel(i, j, Color.FromArgb(gray, gray, gray)); 108 } 109 pb2.Image = bmp1_im2; 110 } 111 112 113 private void gausian_Click(object sender, EventArgs e) 114 { 115 int nx, ny; 116 int gray; 117 118 nx = pb1.Width; 119 ny = pb1.Height; 120 121 // 画像の読み込み(グレースケールに変換) 122 bmp1_im3 = new Bitmap(pb1.Image); 123 124 // フィルタ用のカーネル 125 const int kernelSize = 3; // カーネルサイズ 126 double[,] kernel = new double[kernelSize, kernelSize]{ 127 {1/16.0, 1/8.0, 1/16.0}, 128 {1/8.0, 1/4.0, 1/8.0}, 129 {1/16.0, 1/8.0, 1/16.0}}; 130 /* フィルタ処理 131 bmp1_im3 = Filter(pb3.Image, kernel); 132 */ 133 pb3.Image = bmp1_im3; 134 135 136 137 } 138 139 } 140}
試したこと
'Filter'の定義をしないとだめだと思い、試しましたがエラーがでるだけで、使用できませんでした。フィルタ処理の知識がないプログラム初心者ですみません。
補足情報(FW/ツールのバージョンなど)
大学のPCで visual studio 2005でコードを書いています。
※詳しいデザイン画面を貼るので少しおまちください。
Markdownを利用しましょう
https://teratail.com/help/question-tips#questionTips3-7
また、Filterはどこに定義してあるのでしょうか?
まずは、とにかく、コードを ``` と ``` で囲ってください(``` はバッククォート 3 つ)。インデントされて見やすくなるので。インデントされてないコードは質問者さん自身も読む気がしないのでは? 閲覧者はなおさらです。
(被ったので削除しました)
解答ありがとうございます!
もう一度書き直してみます
[2021/10/26 15:07]の編集を見て:
エラーメッセージは、言い方を変えると「Filterという名前のメソッドが無い(未定義)」と報告しています。そのFilterメソッドは質問者さん自身がコードを書くもののはずです。
また、マークダウン記法を使っ質問を編集されたようですが、コードのインデント(字下げ)がメチャクチャです。Visual Studio 上で編集しているときは適切に表示されていませんでしたか? それをそのままコードとしてコピー&ペーストするなりしましょう。
定義しようと試みたのですが、知識が浅すぎて定義する場所がわかりませんでした。
よければ教えていただけないでしょうか?
Form1内ならどこでもいいですよ。