Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 62 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
62
Dung lượng
2,26 MB
Nội dung
LỜI CẢM ƠN Đầu tiên, em xin gửi lời cảm ơn chân thành sâu sắc tới thầy Trần Mạnh Tuấn, người đưa em đến với đề tài này, tạo điều kiện thuận lợi cho em hoàn thành đồ án tốt nghiệp cách tốt Em xin gửi lời cảm ơn đến thầy cô khoa Công nghệ thông tin trường Đại học Công nghệ thông tin truyền thông Thái Nguyên giúp đỡ, tạo điều kiện cho em thời gian em học tập trường Xin gửi lời cảm ơn tới gia đình động viên, tạo điều kiện cho em thực đồ án tốt nghiệp, lời cảm ơn tới bạn bè giúp đỡ em học tập năm vừa qua Vì thời gian thực tập có hạn, trình độ thân nhiều hạn chế Cho nên đề tài không tránh khỏi thiếu sót, em mong góp ý quý báu thầy cô bạn để đề tài em hoàn thiện Em xin chân thành cảm ơn! Sinh viên Diêm Thị Trà My DANH MỤC CÁC HÌNH VẼ DANH MỤC CÁC THUẬT NGỮ Thuật ngữ Viết tắt Giải thích Panoramic Ảnh X - quang panoramic toàn hàm Bitewing Ảnh X - quang cắn cánh Periapical Ảnh X - quang quanh chóp Automated Dental dentification System ADIS Hệ thống nhận dạng người tự động dựa vào đặc điểm nha khoa Dental diagnosis systems Hệ thống chẩn đoán nha khoa Dental treatment systems Hệ thống điều trị nha khoa Computer vision Thị giác máy tính Image segmentation Phân đoạn ảnh Pixel Điểm ảnh Region of interest ROI Vùng hữu ích/cần quan tâm Những vùng chứa đối Foreground tượng ảnh Background Vùng ảnh Thresholding methods Phương pháp lấy ngưỡng Level set methods Phươngg pháp tập mức Region growing Phương pháp xây dựng vùng Fuzzy C - Means FCM MỤC LỤC MỞ ĐẦU CHƯƠNG 1: BÀI TOÁN PHÂN ĐOẠN ẢNH X – QUANG 1.1 Tổng quan cấu trúc giải phẫu loại ảnh X - quang nha khoa .4 1.1.1 Cấu trúc giải phẫu 1.1.2 Phân loại ảnh X - quang nha khoa 1.2 Bài toán phân đoạn ảnh X - quang nha khoa 1.2.1 Phân đoạn ảnh .9 1.2.2 Phân loại phương pháp phân đoạn ảnh .11 1.2.3 Phân đoạn ảnh X - quang nha khoa 12 1.3 Tổng kết chương .14 CHƯƠNG 2: NGHIÊN CỨU VỀ CÁC PHƯƠNG PHÁP PHÂN ĐOẠN ẢNH XQUANG NHA KHOA MỜ BÁN GIÁM SÁT 15 2.1 Phương pháp lấy ngưỡng .15 2.1.1 Ý tưởng .15 2.1.2 Kỹ thuật lấy ngưỡng thích nghi 17 2.1.3 Kỹ thuật lấy ngưỡng lặp 18 2.1.4 Nhận xét phương pháp lấy ngưỡng lặp 19 2.2 Phương pháp tập mức 20 2.2.1 Ý tưởng .20 2.2.2 Thuật toán 21 2.2.3 Nhận xét phương pháp tập mức 21 2.3 Phương pháp xây dựng vùng 22 2.3.1 Ý tưởng .22 2.3.2 Thuật toán 22 2.3.3 Nhận xét phương pháp xây dựng vùng .23 2.4 Phương pháp phân cụm 23 2.4.1 Ý tưởng .23 2.4.2 Thuật toán K - Means 24 2.4.3 Thuật toán FCM 26 2.4.4 Nhận xét phương pháp phân cụm .28 2.5 Các độ đo đánh giá 28 2.6 Tổng kết chương .30 CHƯƠNG 3: XÂY DỰNG ỨNG DỤNG PHÂN ĐOẠN ẢNH X - QUANG NHA KHOA .31 3.1 Đặc tả yêu cầu 31 3.1.1 Yêu cầu thực tế 31 3.1.2 Mục đích ứng dụng .32 3.2 Đặc tả liệu 32 3.3 Kết chạy chương trình .33 3.3.1 Giao diện ứng dụng: 33 3.3.2 Chọn ảnh cần phân đoạn: 34 3.3.3 Chọn tham số phân đoạn ảnh FCM .34 3.4 Tổng kết chương .37 KẾT LUẬN .38 TÀI LIỆU THAM KHẢO 39 DANH MỤC HÌNH Hình 1.1: Cơ quan (răng nha chu) Hình 1.2.: Bộ sữa kí hiệu sữa Hình 1.3: Bộ vĩnh viễn ký hiệu Hình 1.4: Một số loại ảnh X - quang nha khoa Hình 1.5: Các Phương pháp phân đoạn ảnh 12 Hình 1.6: Những khó khăn việc phân đoạn ảnh nha khoa 13 Hình 2.1: Histograms mức xám mà giá trị ngưỡng chọn 15 Hình 2.2: Ảnh X - quang nha khoa sau lấy ngưỡng toàn cục 17 Hình 2.3: Ảnh X - quang nha khoa mẫu sau lấy ngưỡng thích nghi 17 Hình 2.4: Ảnh X - quang nha khoa sau lấy ngưỡng lặp 19 Hình 2.5: Kết phân đoạn sử dụng Phương pháp tập mức .21 Hình 2.6: Kết phân đoạn sử dụng Phương pháp xây dựng vùng 23 Hình 2.7: Kết phân đoạn sử dụng thuật toán K-means 25 Hình 3.1: Ảnh liệu đầu vào ứng dụng .33 Hình 3.2 Giao diện chương trình .33 Hình 3.3 Hình ảnh minh họa kết phân cụm k = 36 Hình 3.4 Hình ảnh minh họa kết phân cụm k = 37 MỞ ĐẦU Cùng với phát triển ngày mạnh mẽ khoa học kỹ thuật vài thập kỉ gần đây, xử lý ảnh ngày thu hút quan tâm đặc biệt từ nhà khoa học vai trò quan trọng nhiều ứng dụng thực tế khoa học kĩ thuật sống thường ngày như: sản xuất kiểm tra chất lượng, di chuyển Robot, phương tiện lại tự trị, công cụ hướng dẫn cho người mù, an ninh giám sát, nhận dạng đối tượng, nhận dạng khuôn mặt, sản xuất, hiệu chỉnh video, v.v Trong có lĩnh vực mẻ ứng dụng hình ảnh y học Để xử lý ảnh cần trải qua nhiều giai đoạn khác tùy theo mục đích việc xử lý, giai đoạn quan trọng khó khăn phân đoạn ảnh Quá trình phân đoạn ảnh thực phân vùng ảnh thành vùng rời rạc đồng với hay nói cách khác xác định biên vùng ảnh Các vùng ảnh đồng thông thường tương ứng với toàn hay phần đối tượng thật bên ảnh Vì hầu hết ứng dụng lĩnh vực xử lý ảnh, phân đoạn ảnh đóng vai trò thường bước tiền xử lý toàn trình trước thực thao tác khác mức cao nhận dạng đối tượng, biểu diễn đối tượng, nén ảnh dựa đối tượng, hay truy vấn ảnh dựa vào nội dung, v.v Do đó, thành công hệ thống phân tích hình ảnh phụ thuộc nhiều vào chất lượng phân đoạn hình ảnh Ngày nay, việc xử lý hình ảnh y tế có vai trò vô quan trọng việc tự động hóa phân tích, hỗ trợ chẩn đoán điều trị bệnh khác Trong đó, trình phân đoạn thường yêu cầu giai đoạn sơ Tuy nhiên phân vùng hình ảnh y tế phức tạp nên việc phân đoạn xác quan trọng Trong công nghệ hình ảnh y tế, công cụ vô phổ biến cho việc chẩn đoán ảnh X - quang Chính thế, khóa luận đề cập tới phân đoạn ảnh X - quang nha khoa bước xử lý thiếu hệ thống chẩn đoán điều trị bệnh nha khoa, hệ thống nhận dạng người dựa vào đặc điểm nha khoa, v.v Trong phương pháp phân đoạn ảnh có, phân cụm phương pháp sử dụng rộng rãi tính đơn giản hiệu mà mang lại Phân cụm phân chia tập liệu ban đầu vào cụm Trong đó, đối tượng cụm giống (tương tự nhau), đối tượng thuộc cụm khác khác (ít tương tự nhau) theo nghĩa Phân cụm không đòi hỏi thông tin thuộc tính cụm nên đặc biệt hiệu có thông tin cụm Phân cụm gồm có phân cụm cứng (mỗi đối tượng thuộc cụm) phân cụm mờ (mối đối tượng thuộc nhiều cụm) Do thực tế ranh giới cụm thường không rõ ràng, đối tượng liệu thuộc nhiều cụm khác nhau, nên phương pháp phân cụm mờ ngày thể hiệu khai phá, phân tích liệu Khóa luận áp dụng thuật toán phân cụm mờ mà cụ thể thuật toán Fuzzy C - Means để xây dựng ứng dụng phân đoạn ảnh X - quang nha khoa Nội dung đồ án gồm có chương: Chương – TỔNG QUAN VÀ LÝ THUYẾT VỀ PHÂN ĐOẠN ẢNH X – QUANG NHA KHOA Chương đưa kiến thức tổng quan cấu trúc giải phẫu răng, phân loại ảnh X - quang nha khoa, toán phân đoạn ảnh từ nêu toán phân đoạn ảnh X - quang nha khoa, yêu cầu, thách thức ý nghĩa, ứng dụng thực tế hệ thống nhận dạng người hay hệ thống chẩn đoán, điều trị nha khoa Chương - NGHIÊN CỨU VỀ CÁC PHƯƠNG PHÁP PHÂN ĐOẠN ẢNH X- QUANG NHA KHOA MỜ Nội dung chương nhằm đưa nhìn tổng quan phương pháp phân đoạn ảnh nha khoa có: lấy ngưỡng, tập mức, xây dựng vùng đặc biệt phương pháp phân cụm Ở phương pháp đưa thuật toán cụ thể đánh giá ( độ phức tạp, ưu, nhược điểm) thuật toán Chương – XÂY DỰNG ỨNG DỤNG PHÂN ĐOẠN ẢNH X QUANG NHA KHOA Chương mô tả trình xây dựng ứng dụng phân đoạn ảnh X - quang nha khoa phương pháp phân cụm mờ, cụ thể thuật toán Fuzzy C Means: từ đặc tả yêu cầu, thiết triển khai cài đặt Từ minh họa cách rõ ràng cách hoạt động, ứng dụng hiệu thuật toán phân cụm mờ phân đoạn ảnh X - quang nha khoa CHƯƠNG 1: BÀI TOÁN PHÂN ĐOẠN ẢNH X – QUANG 1.1 Tổng quan cấu trúc giải phẫu loại ảnh X - quang nha khoa 1.1.1 Cấu trúc giải phẫu Cơ quan bao gồm nha chu (quanh răng), đơn vị hình thái chức Răng phận trực tiếp nhai nghiền thức ăn, nha chu phận giữ nâng đỡ răng, đồng thời phận nhận cảm, tiếp nhận dẫn truyền lực nhai Răng danh gồm men, ngà (mô cứng) tủy (mô mềm) Nha chu gồm xê măng (còn gọi xương chân răng, men chân răng), dây chằng, xương ổ răng, nướu (lợi) Bộ thể thống thuộc hệ thống nhai, tạo thành xếp có tổ chức quan [1] Hình 1.1: Cơ quan (răng nha chu) Mỗi có phần thân chân Giữa chân chân đường cổ (cổ giải phẫu), đường cong, gọi đường nối men - xê măng Thân bao bọc men răng, chân xê măng bao phủ Nướu viền xung quanh cổ tạo thành bờ, gọi cổ sinh lý Phần thấy miệng thân lâm sàng Cổ sinhh lý thay đổi tùy theo nơi bám bờ viền nướu, tuổi cao nơi bám có khuynh hướng di chuyển dần phía chóp Nhiều trường hợp bệnh lý, nướu bị sưng trụt, làm thân (lâm sàng) bị ngắn lại dài [1] Cấu tạo răng: Bao gồm men răng, ngà (mô cứng) tủy (mô mềm) [1]: - Men răng: Men phủ mặt ngà thân răng, mô cứng thể, có tỉ lệ chất vô cao (96%) Hình dáng bề dày men xác định từ trước mọc ra, đời sống, men bồi đắp thêm mà chi mòn dần theo tuổi, có trao đổi vật lý hóa học môi trường với miệng - Ngà răng: Kém cứng men, chứa tỉ lệ chất vô thấp men (75%) Trong ngà có nhiều ống ngà, chứa đuôi bào tương nguyên bào ngà Bề dày ngà thay đổi đời sống hoạt động nguyên bào ngà Ngà ngày dày theo hướng phía hốc tủy răng, làm hẹp dần hốc tủy - Tủy răng: Là mô liên kết mềm, nằm hốc tủy gồm tủy chân tủy thân Tủy buồng tủy gọi tủy thân, tủy buồng, tủy ống tủy gọi tủy chân Các nguyên bào ngà nằm sát vách hốc tủy Tủy có nhiệm vụ trì sống răng, cụ thể sống nguyên bào ngà tạo ngà thứ cấp, nhận cảm giác Trong tủy có chứa nhiều mạch máu, mạch bạch huyết đầu tận thần kinh Bộ phận nâng đỡ răng: Bao gồm xương ổ răng, xê măng, dây chằng nha chu nướu (lợi) [1] - Xương ổ răng: Là mô xương xốp, bên bao bọc màng xương, nơi nướu bám vào Xương ổ tạo thành huyệt, có hình dáng kích thước phù hợp với chân Bề mặt ổ răng, nơi đối diện với chân răng, mô xương đặc biệt có nhiều lỗ thủng mạch máu dây thần kinh từ xương xuyên qua để nuôi dây chằng nha chu, gọi xương ổ danh, hay sàng Trên hình ảnh tia X, phần xương ổ danh trông cản tia hơn, gọi cứng Nền xương ổ không phân biệt với xương hàm Chiều cao xương ổ thay đổi theo tuổi tùy theo lành mạnh hay bệnh lý mô nha chu //Thiết lập giá trị cho giá trị for (int j = 0; j < this.Clusters.Count; j++) { U[i, j] = (U[i, j] - min) / (max - min); sum += U[i, j]; } //Thiết lập lại cho tổng for (int j = 0; j < this.Clusters.Count; j++) { U[i, j] = U[i, j] / sum; if (double.IsNaN(U[i, j])) { U[i, j] = 0.0; } newmax = U[i, j] > newmax ? U[i, j] : newmax; } // Chỉ số nhóm ClusterIndex sử dụng để lưu trữ giá trị thành viên mạnh cho cluster, p.ClusterIndex = newmax; } } bước thuật toán FCM public double[,] Step() { for (int c = 0; c < Clusters.Count; c++) { for (int h = 0; h < Points.Count; h++) { double top; top = CalculateEuclideanDistance(Points[h], Clusters[c]); 43 if (top < 1.0) top = Eps; double sumTerms = 0.0; for (int ck = 0; ck < Clusters.Count; ck++) { sumTerms += top / CalculateEuclideanDistance(Points[h], Clusters[ck]); } U[h, c] = (double)(1.0 / Math.Pow(sumTerms, (2 (this.Fuzzyness - 1)))); } } this.RecalculateClusterMembershipValues(); return U; } khoảng cách Eclip điểm tâm cụm private double CalculateEuclideanDistance(ListClusterPoint p, ListClusterCentroid c) { return Math.Sqrt(Math.Pow(p.PixelColor.R - c.PixelColor.R, 2.0) + Math.Pow(p.PixelColor.G - c.PixelColor.G, 2.0) + Math.Pow(p.PixelColor.B - c.PixelColor.B, 2.0)); } // tính toán hàm mục tiêu public double CalculateObjectiveFunction() { double Jk = 0.0; for (int i = 0; i < this.Points.Count;i++) { for (int j = 0; j < this.Clusters.Count; j++) { 44 Jk += Math.Pow(U[i, j], this.Fuzzyness) * Math.Pow(this.CalculateEuclideanDistance(Points[i], Clusters[j]), 2); } } return Jk; } hàm tính tâm cụm double[,] tamcum; public double [,] CalculateClusterCentroids() { tamcum = new Double[this.Clusters.Count,2]; for (int j = 0; j < this.Clusters.Count; j++) { ListClusterCentroid c = this.Clusters[j]; double l = 0.0; c.PixelCount = 1; c.RSum = 0; c.GSum = 0; c.BSum = 0; c.MembershipSum = 0; for (int i = 0; i < this.Points.Count; i++) { ListClusterPoint p = this.Points[i]; l = Math.Pow(U[i, j], this.Fuzzyness); c.RSum += l * p.PixelColor.R; c.GSum += l * p.PixelColor.G; c.BSum += l * p.PixelColor.B; c.MembershipSum += l; if (U[i, j] == p.ClusterIndex) { 45 c.PixelCount += 1; } } c.PixelColor = Color.FromArgb((byte)(c.RSum / c.MembershipSum), (byte)(c.GSum / c.MembershipSum), (byte)(c.BSum / c.MembershipSum)); tamcum[j,0] = c.X; tamcum[j,1] = c.Y; } tạo ảnh trung gian Bitmap tempImage = new Bitmap(myImageWidth, myImageHeight, PixelFormat.Format32bppRgb); for (int j = 0; j < this.Points.Count; j++) { for (int i = 0; i < this.Clusters.Count; i++) { ListClusterPoint p = this.Points[j]; if (U[j, i] == p.ClusterIndex) { tempImage.SetPixel((int)p.X, (int)p.Y, this.Clusters[i].PixelColor); } } } // xử lí xong trả lại ảnh kết processedImage = tempImage; return tamcum; } đưa kết nút //chọn ngẫu nhiên điểm làm tâm cụm 46 Random random = new Random(); for (int i = 0; i < numClusters; i++) { int randomNumber1 = random.Next(sourceImage.Width); int randomNumber2 = random.Next(sourceImage.Height); centroids.Add(new ListClusterCentroid(randomNumber1, randomNumber2, filteredImage.GetPixel(randomNumber1, randomNumber2))); } Algorithm alg = new Algorithm(points, centroids, 2, filteredImage, (int)numericUpDown2.Value); int k = 0; { if ((backgroundWorker.CancellationPending == true)) { e.Cancel = true; break; } else { k++; alg.J = alg.CalculateObjectiveFunction(); c= alg.CalculateClusterCentroids(); u = alg.Step(); Jnew = alg.CalculateObjectiveFunction(); 47 Console.WriteLine("Run method i={0} accuracy = {1} delta={2}", k, alg.J, Math.Abs(alg.J - Jnew)); toolStripStatusLabel2.Text = "Precision " + Math.Abs(alg.J Jnew); // định dạng var hiển this giá trị thời gian string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", stopWatch.Elapsed.Hours, stopWatch.Elapsed.Minutes, stopWatch.Elapsed.Seconds, stopWatch.Elapsed.Milliseconds / 10); toolStripStatusLabel3.Text = "Duration: " + elapsedTime; pictureBox2.Image = (Bitmap)alg.getProcessedImage; backgroundWorker.ReportProgress((100 * k) / maxIterations, "Iteration " + k); if (Math.Abs(alg.J - Jnew) < accuracy) break; } } while (maxIterations > k); Console.WriteLine("Done."); stopWatch.Stop(); // lấy giá trị thời gian TimeSpan ts = stopWatch.Elapsed; // lưu ảnh phân đoạn pictureBox2.Image = (Bitmap)alg.getProcessedImage.Clone(); alg.getProcessedImage.Save("segmented.png"); 48 //Tạo hình ảnh cho cụm để trích xuất tính từ ảnh gốc double[,] Matrix = alg.U; Bitmap[] bmapArray = new Bitmap[centroids.Count]; for (int i = 0; i < centroids.Count; i++) { bmapArray[i] = new Bitmap(sourceImage.Width, sourceImage.Height, PixelFormat.Format32bppRgb); } for (int j = 0; j < points.Count; j++) { for (int i = 0; i < centroids.Count; i++) { ListClusterPoint p = points[j]; if (Matrix[j, i] == p.ClusterIndex) { bmapArray[i].SetPixel((int)p.X, (int)p.Y, p.OriginalPixelColor); } } } // lưu ảnh cho cụm phân đoạn 49 for (int i = 0; i < centroids.Count; i++) { bmapArray[i].Save("Cluster" + i + ".png"); } backgroundWorker.ReportProgress(100, "Done in " + k + " iterations."); for (int i = 0; i < points.Count; i++) { points[i] = null; } for (int i = 0; i < centroids.Count; i++) { centroids[i] = null; } alg = null; } // hàm mở file ảnh private void openToolStripMenuItem_Click(object sender, EventArgs e) { if (openFileDialog.ShowDialog() == DialogResult.OK) { try { button2.Enabled = true; pictureBox1.Image = new Bitmap(openFileDialog.FileName); 50 originalImage = (Bitmap)pictureBox1.Image.Clone(); sourceImage = (Bitmap)pictureBox1.Image.Clone(); pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; pictureBox2.SizeMode = PictureBoxSizeMode.StretchImage; } catch (NotSupportedException ex) { MessageBox.Show("Image format is not supported: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } catch (ArgumentException ex) { MessageBox.Show("Invalid image: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } catch { MessageBox.Show("Failed loading the image", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } private void button3_Click(object sender, EventArgs e) { if (backgroundWorker != null) { backgroundWorker.CancelAsync(); } 51 toolStripStatusLabel1.Text = "Aborting, please wait "; } private void button1_Click(object sender, EventArgs e) { MessageBox.Show("Giá trị hàm mục tiêu: "+Jnew.ToString()); } private void button4_Click(object sender, EventArgs e) { Bitmap bmp = (Bitmap)pictureBox1.Image; int wid = bmp.Size.Width; int hei = bmp.Size.Height; int[, ,] test = new int[3, wid, hei]; Color col; for (int i = 0; i < wid; i++) { for (int j = 0; j < hei; j++) { col = bmp.GetPixel(i, j); test[0, i, j] = col.R; test[1, i, j] = col.G; test[2, i, j] = col.B; } } System.IO.StreamWriter file = new System.IO.StreamWriter("C:\\Users\\TraMy\\Desktop\\ảnh ban đầu.txt"); 52 file.WriteLine("Pixel : R G B"); for (int i = 0; i < wid; i++) { for (int j = 0; j < hei; j++) { col = bmp.GetPixel(i, j); test[0, i, j] = col.R; test[1, i, j] = col.G; test[2, i, j] = col.B; file.WriteLine("{0} x {1}: {2} {3} {4}", i + 1, j + 1, test[0, i, j], test[1, i, j], test[2, i, j]); } } file.Close(); Bitmap bmp2 = (Bitmap)pictureBox2.Image; int wid2 = bmp2.Size.Width; int hei2 = bmp2.Size.Height; int[, ,] test2 = new int[3, wid2, hei2]; Color col2; for (int i = 0; i < wid2; i++) { for (int j = 0; j < hei2; j++) { col2 = bmp2.GetPixel(i, j); test2[0, i, j] = col2.R; 53 test2[1, i, j] = col2.G; test2[2, i, j] = col2.B; } } System.IO.StreamWriter file2 = new System.IO.StreamWriter("C:\\Users\\TraMy\\Desktop\\ảnh kết quả.txt"); file2.WriteLine("Pixel : R G B"); widtest = wid2; heitest = hei2; for (int i = 0; i < wid2; i++) { for (int j = 0; j < hei2; j++) { col2 = bmp2.GetPixel(i, j); test2[0, i, j] = col2.R; test2[1, i, j] = col2.G; test2[2, i, j] = col2.B; file2.WriteLine("{0} x {1}: {2} {3} {4}", i + 1, j + 1, test2[0, i, j], test2[1, i, j], test2[2, i, j]); } } input = test; file2.Close(); MessageBox.Show("Tạo ma trận thành công!"); } private void button5_Click(object sender, EventArgs e) { System.IO.StreamWriter file = new System.IO.StreamWriter("C:\\Users\\TraMy\\Desktop\\tâm cụm.txt"); file.WriteLine("Tâm cụm:"); 54 for (int i = 0; i < numericUpDown2.Value; i++) { file.WriteLine("{0},{1}",c[i,0],c[i,1]); } file.Close(); MessageBox.Show("Tạo ma trận tâm cụm thành công!"); } private void button6_Click(object sender, EventArgs e) { Bitmap bmp = (Bitmap)pictureBox2.Image; int wid = bmp.Size.Width; int hei = bmp.Size.Height; System.IO.StreamWriter file = new System.IO.StreamWriter("C:\\Users\\TraMy\\Desktop\\ma trận U.txt"); file.WriteLine("Ma trận U:"); for (int i = 0; i < wid * hei; i++) { for (int j = 0; j < numericUpDown2.Value; j++) { file.Write("{0} ", u[i, j]); } file.WriteLine(); } file.Close(); MessageBox.Show("Tạo ma trận U thành công!"); } private void Form1_Load(object sender, EventArgs e) { } 55 public static int widtest,heitest; public static int[, ,] input = new int[3, widtest, heitest]; private void btnPBM_Click(object sender, EventArgs e) { int sophantu=0; int tong=0; double e1 = 0,ek=0,dk=0; for (int i = 0; i < originalImage.Width; i++) { for (int j = 0; j < originalImage.Height; j++) { sophantu++; tong += input[0, i, j]; } } //MessageBox.Show("so phan tu: " + originalImage.Height); double trungbinhcong = tong / sophantu; //MessageBox.Show("Trung binh cong: "+trungbinhcong); for (int i = 0; i < originalImage.Width; i++) { for (int j = 0; j < originalImage.Height; j++) { e1 += Math.Pow((input[0, i, j] - trungbinhcong),2); } } e1 = Math.Sqrt(e1); //MessageBox.Show("e1 : " + e1); for (int i = 0; i < originalImage.Width; i++) { 56 for (int j = 0; j < originalImage.Height; j++) { for (int k = 0; k < numericUpDown2.Value; k++) { ek += Math.Pow((input[0, i, j] - c[k, 0]),2); } } } ek = Math.Sqrt(ek); //MessageBox.Show("ek : " + ek); double[] kc = new double[Convert.ToInt32(numericUpDown2.Value)]; double max = 0, pbm=0; for (int k = 0; k < numericUpDown2.Value; k++) { for (int i = k; i < numericUpDown2.Value; i++) { if (max < Math.Abs((c[i, 0] - c[k, 0]))) max = Math.Pow((Math.Abs(c[i,0]-c[k,0])),2); } } dk = max; //MessageBox.Show("Max: " + max); pbm = Math.Pow(((e1 * dk) / (Convert.ToInt32(numericUpDown2.Value) * ek)),2); //MessageBox.Show(numericUpDown2.Value.ToString()); MessageBox.Show("Độ đo: "+pbm); } 57 ... quang nha khoa 1.2 Bài toán phân đoạn ảnh X - quang nha khoa 1.2.1 Phân đoạn ảnh .9 1.2.2 Phân loại phương pháp phân đoạn ảnh .11 1.2.3 Phân đoạn ảnh X - quang nha khoa. .. thuật toán phân cụm mờ a) Ảnh cắn cánh b) ảnh quanh chóp c) ảnh pano toàn hàm Hình 1.4: Một số loại ảnh X - quang nha khoa 1.2 Bài toán phân đoạn ảnh X - quang nha khoa 1.2.1 Phân đoạn ảnh Trong thị... PHÂN ĐOẠN ẢNH X- QUANG NHA KHOA MỜ Do vấn đề nêu trên, việc tìm phương pháp phân đoạn ảnh X - quang nha khoa hiệu thách thức Những phương pháp phân đoạn ảnh điển hình thực ảnh X - quang nha khoa