• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Xử Lý Ảnh = VB.Net

Các bài viết hướng dẫn về Visual Basic .NET và C#

Điều hành viên: tungcan5diop, QUANITGROBEST

Hình đại diện của người dùng
1045007
Thành viên danh dự
Thành viên danh dự
Bài viết: 551
Ngày tham gia: T.Hai 09/06/2008 3:35 pm
Đến từ: TP Cần Thơ
Has thanked: 2 time
Been thanked: 64 time
Liên hệ:

Xử Lý Ảnh = VB.Net

Gửi bàigửi bởi 1045007 » T.Hai 18/05/2009 5:04 pm

Tên bài viết: Xử Lý Ảnh (xla) = VB.Net
Tác giả: 1045007
Cấp độ: trung bình


Xử Lý Ảnh = VB.Net


- Thông thường xla được lập trình trên các ngôn ngữ thuộc họ C…, lý do đơn giản vì các ngôn ngữ này hổ trợ con trỏ (pointer) nhằm truy cập trực tiếp và các ô nhớ, giúp quá trình xla ảnh được nhanh hơn thay vì truy cập một cách gián tiếp.
- Mục đích của xử lý ảnh:
+ Tăng cường, phục hồi, nâng cao chất lượng ảnh
+ Trích lọc thông tin từ ảnh
- Các phép xử lý thường áp dụng trên ảnh nhị phân, hoặc ảnh mức xám
- Có 2 miền xử lý chính: không gian và tần số
- Có 3 loại xử lý chính: xử lý trên điểm ảnh, xử lý lân cận, xử lý toàn cục (thường được xử lý trên miền tần số)

- Những kiến thức cơ bản liên quan
+ Không gian màu RGB
+ Cơ bản về ảnh số
+ Cách biểu diễn ảnh số
+ Độ phân giải ảnh, màu
+ Ngôn ngữ lập trình VB.Net

Ví dụ từ phần 1 - 3
XuLyAnh.rar
Ví dụ từ 1-3
(57.82 KiB) Đã tải 6113 lần
Sửa lần cuối bởi 1045007 vào ngày T.Năm 11/06/2009 5:04 pm với 2 lần sửa.


Xếp hình cổ điển for Android-https://play.google.com
♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀

Hình đại diện của người dùng
1045007
Thành viên danh dự
Thành viên danh dự
Bài viết: 551
Ngày tham gia: T.Hai 09/06/2008 3:35 pm
Đến từ: TP Cần Thơ
Has thanked: 2 time
Been thanked: 64 time
Liên hệ:

Re: Xử Lý Ảnh = VB.Net

Gửi bàigửi bởi 1045007 » T.Hai 18/05/2009 5:44 pm

PHẦN I – XỬ LÝ TRÊN MIỀN KHÔNG GIAN


1. Chuyển đổi cơ bản
1.1 Sử dụng phương thức Set-GetPixel


- Thông thường ảnh được xử lý trên ảnh mức xám (1 lớp màu), ảnh trắng đen (ảnh nhị -phân)
- Vậy làm sao để chuyển 1 ảnh màu về ảnh mức xám hay ảnh nhị phân? …
- Như các bạn đã biết
+ 1 ảnh mức xám có nghĩa là: 1 điểm ảnh trong ảnh này được biểu diễn bằng 1 số 8 bit = 2^8=256 giá trị từ tối tới sáng
+ 1 ảnh nhị phân: 1 điểm ảnh được biểu diễn bằng số 1 bit = 2^1=2 giá trị tối và sáng
+ Ảnh màu đương nhiên được tổng hợp từ 3 màu R-G-B

Vd:
nhi phan - xam.jpg


- Để chuyển ảnh màu về ảnh xám chúng ta có công thức sau:
a. O(x,y)=( IR(x,y) + IG(x,y) + IB(x,y)) /3
Với:
x,y là tạo độ của điểm ảnh
IR thành phân màu đỏ tại màu I(x,y)
IG thành phân màu xanh lá tại màu I(x,y)
IB thành phân màu xanh dương tại màu I(x,y)
O(x,y): mà đầu ra, I(x,y) màu đầu vào

b. O(x,y)= IR(x,y) * 0.287 + IG(x,y) * 0.599 + IB(x,y) * 0.114

VD1:
Sử dụng công thức b cho vd1 sau:

Mã: Chọn hết

  1. Function ToGray(ByVal bm As Bitmap) As Bitmap
  2.         Dim bitmap As New Bitmap(bm)
  3.         Dim x, y As Integer
  4.         Dim c As Color
  5.         Dim gray As Byte
  6.         For y = 0 To bm.Height - 1
  7.             For x = 0 To bm.Width - 1
  8.                 c = bm.GetPixel(x, y)
  9.                 gray = c.R * 0.287 + c.G * 0.599 + c.B * 0.114
  10.                 bitmap.SetPixel(x, y, Color.FromArgb(gray, gray, gray))
  11.             Next
  12.         Next
  13.         Return bitmap
  14.     End Function

Vd:
goc.JPG
Ảnh gốc
goc.JPG (17.94 KiB) Đã xem 20907 lần

ketqua.png
Ảnh Xám
ketqua.png (28.86 KiB) Đã xem 20906 lần


- Đối với ảnh nhị phân ta kiểm tra giá trị màu nếu <128 thì set lại giá trị là 0 ngược lại set giá trị là 255.
Ta có công thức sau:
O(x,y)= 0 nếu I(x,y) < C
[b]O(x,y)= 255 ngược lại

Với C là ngưởng (-1 < C < 256) cần phân ngưỡng

Vd2:

Mã: Chọn hết

  1. Function ToBinary(ByVal bm As Bitmap, ByVal band As Byte) As Bitmap
  2.         Dim bitmap As New Bitmap(bm)
  3.         Dim x, y As Integer
  4.         Dim c As Color
  5.         For y = 0 To bm.Height - 1
  6.             For x = 0 To bm.Width - 1
  7.                 c = bm.GetPixel(x, y)
  8.                 If c.R < band Then
  9.                     bitmap.SetPixel(x, y, Color.FromArgb(0, 0, 0))
  10.                 Else
  11.                     bitmap.SetPixel(x, y, Color.FromArgb(255, 255, 255))
  12.                 End If
  13.             Next
  14.         Next
  15.         Return bitmap
  16.     End Function


- Ở hàm trên If c.R < band Then tui sử dụng là c.R vì đối với ảnh mức xám thì 3 thành phần màu bằng nhau nên không cần phân biệt c.R, c.G hay C.B.
- bạn hãy tạo 1 project rồi kiểm thử nó.
Xếp hình cổ điển for Android-https://play.google.com
♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀

Hình đại diện của người dùng
1045007
Thành viên danh dự
Thành viên danh dự
Bài viết: 551
Ngày tham gia: T.Hai 09/06/2008 3:35 pm
Đến từ: TP Cần Thơ
Has thanked: 2 time
Been thanked: 64 time
Liên hệ:

Re: Xử Lý Ảnh = VB.Net

Gửi bàigửi bởi 1045007 » T.Hai 18/05/2009 6:34 pm

1.2 Sử dụng LockBits

- Nhìn lại vd2, chuyện gì đã xảy ra…: Chạy tốt, nhưng vấn đề là thời gian

- Hai hàm trên đều sử dụng 2 phương thức set và get, về mặc thuật toán có lẻ bạn nghĩ 2 vòng lặp đó đã làm cho chương trình trở nên quá rùa đồng thời nếu sử dụng ảnh có độ phân giải hơi lớn tí là có thể treo cùi bắp luôn.

- Vấn đề không phải giải thuật mà chính do 2 phương thức set và getpixel gây nên, khi bạn gọi 2 phương thức này hệ hệ điều hành Win sẽ Lock ảnh lại đến khi kết thúc phương thức vừa goi tự động sẽ UnLock ảnh đó cho việt truy cập lần sau. Chính việc Lock rồi Unlock liên tục đã làm đã làm cho hàm trên xử lý chậm rãi từ tốn.

- Giải thuật sau dùng kỹ thuật LockBits

Mã: Chọn hết

  1. Function ToBinaryLocBits(ByVal bm As Bitmap, ByVal band As Byte) As Bitmap
  2.  
  3.         Dim bitmap As New Bitmap(bm)
  4.         Dim rec As New Rectangle(0, 0, bitmap.Width, bitmap.Height)
  5.         Dim bmpData As System.Drawing.Imaging.BitmapData = bitmap.LockBits(rec, Drawing.Imaging.ImageLockMode.ReadWrite, bitmap.PixelFormat)
  6.         Dim ptr As IntPtr = bmpData.Scan0
  7.         Dim bytes As Integer = bmpData.Stride * bitmap.Height
  8.         Dim rgbValues(bytes - 1) As Byte
  9.         System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes)
  10.         Dim color As Byte
  11.         For counter As Integer = 0 To rgbValues.Length - 1 Step 4
  12.             color = rgbValues(counter)
  13.             If color < band Then
  14.                 rgbValues(counter + 0) = 0
  15.                 rgbValues(counter + 1) = 0
  16.                 rgbValues(counter + 2) = 0
  17.             Else
  18.                 rgbValues(counter + 0) = 255
  19.                 rgbValues(counter + 1) = 255
  20.                 rgbValues(counter + 2) = 255
  21.             End If
  22.         Next
  23.         System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes)
  24.         bitmap.UnlockBits(bmpData)
  25.         Return bitmap
  26.     End Function


- Giải thuật trên chủ yêu dựa trên 2 hàm:

Mã: Chọn hết

  1. System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes)
  2. System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes)

- Nhiệm vụ là Sao chép các ô nhớ từ ptr vào mảng byte và ngược lại
- Tại sao lại Step 4? Đối với lớp Bitmap, khi ta khai báo khởi tạo bằng phương thức New sẽ nhận được đầu vào là 1 bitmap định dạng 32bit

Mã: Chọn hết

  1. Dim bitmap As New Bitmap(bm)

Nếu chỉ gán bằng thì PixelFormat sẽ nhận định dạng bằng chính ảnh đầu vào

Mã: Chọn hết

  1. Dim bitmap As Bitmap
  2. bitmap = bm

-> để tổng quát tui dùng phương thức New
Hình minh hoạ:
MinhHoaPtr.JPG

Bạn thử viết lại vd1 với LockBits rồi so sánh với get-Set
Xếp hình cổ điển for Android-https://play.google.com
♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀

Hình đại diện của người dùng
1045007
Thành viên danh dự
Thành viên danh dự
Bài viết: 551
Ngày tham gia: T.Hai 09/06/2008 3:35 pm
Đến từ: TP Cần Thơ
Has thanked: 2 time
Been thanked: 64 time
Liên hệ:

Re: Xử Lý Ảnh = VB.Net

Gửi bàigửi bởi 1045007 » T.Ba 19/05/2009 11:06 pm

1.3 Tổ Chức Đồ (Histogram)
Định Nghĩa:
Là đồ thị mô tả mối quan hệ giữa mức xám và số điểm ảnh có chung mức xám

VD:
ToChuDo.PNG
ToChuDo.PNG (5.44 KiB) Đã xem 20837 lần


- Tổ chức đồ được xử lý trên điểm ảnh, thường được xử lý để nâng cao chất lượng ảnh có thể dùng để nhận dạng ảnh
- Cánh tính:
+ Tính h(x) là số lượng điểm ảnh có cùng mức xám x
+ Chạy i từ 0 -> 255 đếm số điểm ảnh có cùng mức xám i

VD: Tính H(x) cho ảnh xám

Mã: Chọn hết

  1. Dim x, y As Integer
  2. Dim H(255) As Integer
  3. For y = 0 To bm.Height - 1
  4.     For x = 0 To bm.Width - 1
  5.         H(bm.GetPixel(x, y).R) += 1
  6.     Next
  7. Next


- Sau khi thoát khỏi vòng lặp, mỗi phần tử trong mảng H là giá trị số lượng điểm ảnh tại mức xám của vị trí phần tử đó
VD: H(113) = 720, suy ra mức xám thứ 113 có 720 điểm ảnh
VDToChucDo.PNG

Nhận Xét: với hình trên, thấy rằng trong ảnh góc cường độ sáng của ảnh là trung bình (không tối, không sáng) , so với tổ chức đồ tương ứng nơi cao nhất tập trung ở giữa đồ thị và tương đương với mức xám 128.

- Nếu thực sự bạn đã hiểu mới quan hệ giữa ảnh và tổ chức đồ hãy xem vd sau:
SoSanh.PNG

- Bạn có thấy sự khác biệt giữa 2 ảnh? Rõ ràng ảnh sau có cường độ sáng cao hơn ảnh trước và điều đó tương đương với tổ chức đồ của 2 ảnh, chân của tổ chức đồ sau lệch về phải hơn so với tổ chức đồ trước.
Vậy dựa vào tổ chức đồ của ảnh ta có thể nhận dạng ảnh tối hay sáng.
+ Nếu ảnh tối => ảnh sáng : Kéo tổ chức đồ về phải
+ Nếu ảnh sáng => ảnh tối : Kéo tổ chức đồ về trái

(Các phép toán trên tổ chức đồ ta sẽ tìm hiểu ở phần sau)


- Vẽ tổ chức đồ:

Mã: Chọn hết

  1. Function HistogramGray(ByVal bm As Bitmap, ByVal h() As Integer) As Bitmap
  2.     'Tinh H(x)
  3.     Dim x, y As Integer
  4.     For y = 0 To bm.Height - 1
  5.         For x = 0 To bm.Width - 1
  6.             h(bm.GetPixel(x, y).R) += 1
  7.         Next
  8.     Next
  9.  
  10.     'Phân bố lại khích với pictureBox
  11.     Dim max As Integer = h(0)
  12.     For j As Integer = 1 To 255
  13.         If max < h(j) Then
  14.             max = h(j)
  15.         End If
  16.     Next
  17.  
  18.     'Vẽ
  19.     Dim Height As Integer = 100
  20.     Dim bmHistogram As New Bitmap(256, 100)
  21.     Dim gp As Graphics = Graphics.FromImage(bmHistogram)
  22.     gp.FillRectangle(New Pen(Color.Black).Brush, New Rectangle(0, 0, bmHistogram.Width, bmHistogram.Height))
  23.     Dim n As Integer
  24.     For i As Integer = 0 To 255
  25.         n = (h(i) * Height) / max
  26.         gp.DrawLine(New Pen(Color.Gray), i, 100, i, 100 - n)
  27.     Next
  28.  
  29.     Return bmHistogram
  30. End Function


- Chép code trên vào project để kiểm tra.
- Bạn có thể cải tiên giải thuật trên cho ảnh màu và tốc độ xử lý.
- Chúc thành công!
Xếp hình cổ điển for Android-https://play.google.com
♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀

Hình đại diện của người dùng
1045007
Thành viên danh dự
Thành viên danh dự
Bài viết: 551
Ngày tham gia: T.Hai 09/06/2008 3:35 pm
Đến từ: TP Cần Thơ
Has thanked: 2 time
Been thanked: 64 time
Liên hệ:

Re: Xử Lý Ảnh = VB.Net

Gửi bàigửi bởi 1045007 » T.Năm 21/05/2009 11:24 pm

2. Một số phép toán trên tổ chức đồ

- Trong phần này chúng ta đi vào các phép xử lý tổ chức đồ cơ bản.
- Như đã biết, tổ chức đồ là một đặt trưng quan trọng của ảnh, dựa vào tổ chức đồ chúng ta có thể nhận dạng sơ về ảnh, có kết luận cơ bản về ảnh: ảnh sáng, tối, độ tương phản thấp, cao…. Với lý do đó, chúng ta có một số phép xử lý sau:

+ Trượt tổ chức đồ
+ Căng tổ chứ đồ
+ Sửa chữa tổ chức đồ
+ San lấp tổ chức đồ



2.1 Trượt tổ chức đồ

Mục đích: làm tăng hoặc giảm cường độ xám của ảnh

O(x,y) = I(x,y) + n
n < 0 : trượt ảnh về bên trái => ảnh tối hơn
n > 0 : trượt ảnh về bên phải => ảnh sáng hơn

Chú ý: Kết quả của O(x,y) có thể > 255 hoặc < 0 vì vậy bạn cần chú ý để set lại 2 giá trị này

Code:

Mã: Chọn hết

  1. Function HisToGramStep(ByVal bm As Bitmap, ByVal n As Integer) As Bitmap
  2.     Dim bipmap As New Bitmap(bm)
  3.     Dim x, y As Integer
  4.     Dim c As Color
  5.     For y = 0 To bipmap.Height - 1
  6.         For x = 0 To bipmap.Width - 1
  7.             c = bipmap.GetPixel(x, y)
  8.             If (c.R + n) <= 255 And (c.R + n) >= 0 Then
  9.                 bipmap.SetPixel(x, y, Color.FromArgb(c.R + n, c.R + n, c.R + n))
  10.             ElseIf (c.R + n) > 255 Then
  11.                 bipmap.SetPixel(x, y, Color.FromArgb(255, 255, 255))
  12.             ElseIf (c.R + n) < 0 Then
  13.                 bipmap.SetPixel(x, y, Color.FromArgb(0, 0, 0))
  14.             End If
  15.         Next
  16.     Next
  17.     Return bipmap
  18. End Function


Kết quả:
vd_truotTCD.PNG


2.2 Căng tổ chức đồ

Mục đích: làm thay đổi độ tương phản của ảnh (bạn tự tìm hiểu độ tương phản là gì?)

O(x,y) = I(x,y) x n (với n > 0)
n < 1 : thu hẹp chân tổ chức đồ => giảm độ tương phản của ảnh
n > 1 : mở rộng chân tổ chức đồ => tăng độ tương phản của ảnh

Code:

Mã: Chọn hết

  1. Function HisToGramStretch(ByVal bm As Bitmap, ByVal n As Single) As Bitmap
  2.  
  3.     If n <= 0 Then
  4.         Return Nothing
  5.     End If
  6.  
  7.     Dim bipmap As New Bitmap(bm)
  8.     Dim x, y As Integer
  9.     Dim c As Color
  10.    
  11.     For y = 0 To bipmap.Height - 1
  12.         For x = 0 To bipmap.Width - 1
  13.             c = bipmap.GetPixel(x, y)
  14.             If (c.R * n) <= 255 And (c.R * n) >= 0 Then
  15.                 bipmap.SetPixel(x, y, Color.FromArgb(c.R * n, c.R * n, c.R * n))
  16.             ElseIf (c.R * n) > 255 Then
  17.                 bipmap.SetPixel(x, y, Color.FromArgb(255, 255, 255))
  18.             ElseIf (c.R * n) < 0 Then
  19.                 bipmap.SetPixel(x, y, Color.FromArgb(0, 0, 0))
  20.             End If
  21.         Next
  22.     Next
  23.     Return bipmap
  24. End Function


Kết quả:
vdCangTCD.PNG


Kết quả sau khi căng, tổ chức đồ đã được phân bố đều từ mức xám 0 đến 255.
Xếp hình cổ điển for Android-https://play.google.com
♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀

Hình đại diện của người dùng
1045007
Thành viên danh dự
Thành viên danh dự
Bài viết: 551
Ngày tham gia: T.Hai 09/06/2008 3:35 pm
Đến từ: TP Cần Thơ
Has thanked: 2 time
Been thanked: 64 time
Liên hệ:

Re: Xử Lý Ảnh = VB.Net

Gửi bàigửi bởi 1045007 » CN 24/05/2009 5:19 pm

2.3 Sửa chữa tổ chức đồ

Mục đích: nhằm có một tổ chức đồ tối ưu => nâng cao chất lượng ảnh

- Kết hợp giữa trượt và căng tổ chức đồ.
+ Trượt tổ chức đồ về bên trái sao cho mức xám nhỏ nhất (có giá trị) về 0.
+ Căng tổ chức đồ sao cho mức xám lớn nhất (có giá trị) bằng 255.

O(x,y) = I(x,y) * 255 / max(h())

VD: ảnh minh họa
vdSuaChuaTCD.png

Code:
Bước 1: tính h(x) cho mỗi mức xám

Mã: Chọn hết

  1. Sub GetH(ByVal bm As Bitmap, ByVal toH() As Integer)
  2.     Dim x, y As Integer
  3.     For y = 0 To bm.Height - 1
  4.         For x = 0 To bm.Width - 1
  5.             toH(bm.GetPixel(x, y).R) += 1
  6.         Next
  7.     Next
  8. End Sub


Bước 2: xác định mức xám nhỏ và mức xám lớn nhất có giá trị

Mã: Chọn hết

  1. Function HistogramLeft(ByVal h() As Integer) As Byte
  2.     For i As Integer = 0 To h.Length - 1
  3.         If h(i) <> 0 Then
  4.             Return i
  5.         End If
  6.     Next
  7.     Return 0
  8. End Function
  9.  
  10. Function HistogramRight(ByVal h() As Integer) As Byte
  11.     For i As Integer = h.Length - 1 To 0 Step -1
  12.         If h(i) <> 0 Then
  13.             Return i
  14.         End If
  15.     Next
  16.     Return 0
  17. End Function


Bước 3: ráp lại theo thứ tự giải thuật

Mã: Chọn hết

  1. Function HistogramEdit(ByVal bm As Bitmap) As Bitmap
  2.     Dim bipmap As New Bitmap(bm)
  3.  
  4.     'Tinh  h(x)
  5.     Dim hL(255) As Integer
  6.     Dim hR(255) As Integer
  7.  
  8.     GetH(bipmap, hL)
  9.     'Tim Trai & truot trai
  10.     Dim left As Integer = HistogramLeft(hL)
  11.     bipmap = New Bitmap(HistogramStep(bm, -left))
  12.  
  13.     'Tinh tien ve 0 va copy hL qua hR
  14.     Array.Copy(hL, left, hR, 0, hL.Length - left)
  15.  
  16.     Dim x, y As Integer
  17.     Dim c As Byte   
  18.     Dim max As Byte = HistogramRight(hR)
  19.  
  20.     For y = 0 To bipmap.Height - 1
  21.         For x = 0 To bipmap.Width - 1
  22.             c = bipmap.GetPixel(x, y).R
  23.             c = c / max * 255
  24.             bipmap.SetPixel(x, y, Color.FromArgb(c, c, c))
  25.         Next
  26.     Next
  27.     Return bipmap
  28. End Function



Chú ý: tìm left cho hL(x) trước khi trượt về trái, tìm right khi đã trượt về trái đồng thời đã tính hR(x), lợi dụng tính trượt của tổ chức đồ vì thế tôi không cần phải tính lại hR(x) mà chỉ thông qua hàm copy của lớp Array:

Mã: Chọn hết

  1. 'Tinh tien ve 0 va copy hL qua hR
  2. Array.Copy(hL, left, hR, 0, hL.Length - left)


Xong! Chỉ có thế, giờ thì bạn có thể kiểm tra…
Xếp hình cổ điển for Android-https://play.google.com
♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀

Hình đại diện của người dùng
1045007
Thành viên danh dự
Thành viên danh dự
Bài viết: 551
Ngày tham gia: T.Hai 09/06/2008 3:35 pm
Đến từ: TP Cần Thơ
Has thanked: 2 time
Been thanked: 64 time
Liên hệ:

Re: Xử Lý Ảnh = VB.Net

Gửi bàigửi bởi 1045007 » T.Hai 01/06/2009 4:49 pm

2.4 San lấp tổ chức đồ

Mục đích: phân bố lại các mức xám => tăng độ tương phản của ảnh
- Tổ chức đồ của ảnh kết quả sẽ ít lõm hơn ảnh ban đầu
SAnLap.PNG
SAnLap.PNG (3.76 KiB) Đã xem 20302 lần

- Từ đó ta có một số công thức sau cho việc san lấp:
CongThucSanLap.PNG
CongThucSanLap.PNG (14.98 KiB) Đã xem 20301 lần

Code:

Mã: Chọn hết

  1. Function HistogramEqualization(ByVal bm As Bitmap) As Bitmap
  2.     Dim bitmap As New Bitmap(bm)
  3.     Dim w As Integer = bitmap.Width * bitmap.Height
  4.     'Tinh to chuc do
  5.     Dim h(255) As Integer
  6.     Dim hN(255) As Single
  7.     GetH(bm, h)
  8.  
  9.     'Chuan hoa to chuc do
  10.     For i As Integer = 0 To 255
  11.         hN(i) = h(i) / w
  12.     Next
  13.  
  14.     'Tinh ham mat do xac Suat
  15.     Dim Z(255) As Single
  16.     Z(0) = hN(0)
  17.     For i As Integer = 1 To 255
  18.         Z(i) = Z(i - 1) + hN(i)
  19.     Next
  20.  
  21.     Dim x, y As Integer
  22.     Dim c As Byte
  23.    
  24.     For y = 0 To bitmap.Height - 1
  25.         For x = 0 To bitmap.Width - 1
  26.             c = bitmap.GetPixel(x, y).R
  27.             c = Math.Round(Z(c) * 255)
  28.             bitmap.SetPixel(x, y, Color.FromArgb(c, c, c))
  29.         Next
  30.        
  31.     Next
  32.    
  33.     Return bitmap
  34. End Function


Chú ý:
- Nếu dựa theo công thức tính hàm mật độ xác suất thì cách tính sau có lẻ hay hơn vì rút ngắn thời gian tính toán

Mã: Chọn hết

  1. 'Tinh ham mat do xac Suat
  2. Dim Z(255) As Single
  3. Z(0) = hN(0)
  4. For i As Integer = 1 To 255
  5.     Z(i) = Z(i - 1) + hN(i)
  6. Next


Kết quả:
VDSanLap.PNG

Kết luận về tổ chức đồ:
- Dựa vào tổ chức đồ ta có thể kết luận về ảnh tương đối chính xác mà từ đó có thể xử lý chúng để được một ảnh tốt hơn
- Việc san lấp xảy ra khi căng và trượt không có tác dụng nâng cao chất lượng ảnh
- Trên thực tế, việc xử lý không phải lúc nào cũng xảy ra trên toàn bộ ảnh nên việc xử lý toàn cục như trên là không có tác dụng. Vì thế các giải thuật trên các bạn cần sửa lại 1 cách hợp lý để việc xử lý ảnh có kết quả tốt nhất.
Xếp hình cổ điển for Android-https://play.google.com
♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀

Hình đại diện của người dùng
1045007
Thành viên danh dự
Thành viên danh dự
Bài viết: 551
Ngày tham gia: T.Hai 09/06/2008 3:35 pm
Đến từ: TP Cần Thơ
Has thanked: 2 time
Been thanked: 64 time
Liên hệ:

Re: Xử Lý Ảnh = VB.Net

Gửi bàigửi bởi 1045007 » T.Năm 11/06/2009 10:22 am

3. Các phép toán trên ảnh

3.1 And
- Ở phân này, các phép toán tuơng đối cơ bản, vì thế các bạn có thể tự code mà cũng chả cần xem code của ai :D
- Để minh họa các bạn xem hình dưới đây:
CacPhepToanTrenAnh.PNG

Ví dụ đơn giản về phép toán and

Mã: Chọn hết

  1.  
  2. 'And
  3. For y = 0 To bitmap.Height - 1
  4.   For x = 0 To bitmap.Width - 1
  5.      r = bm1.GetPixel(x, y).R And bm2.GetPixel(x, y).R
  6.      g = bm1.GetPixel(x, y).G And bm2.GetPixel(x, y).G
  7.      b = bm1.GetPixel(x, y).B And bm2.GetPixel(x, y).B
  8.      bitmap.SetPixel(x, y, Color.FromArgb(r, g, b))
  9.   Next
  10. Next


Kết quả:
and.PNG

3.2 Not, Or, Xor, +, _ , *, ...

Các phép toán khác tương tự như phép toán trên
Xếp hình cổ điển for Android-https://play.google.com
♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀

Hình đại diện của người dùng
haitu
Guru
Guru
Bài viết: 206
Ngày tham gia: T.Bảy 10/09/2005 2:50 pm
Has thanked: 1 time
Been thanked: 19 time
Liên hệ:

Re: Xử Lý Ảnh = VB.Net

Gửi bàigửi bởi haitu » T.Năm 11/06/2009 3:00 pm

hay, cái này làm nhớ tới học môn xử lý ảnh quá :D, hồi đó kết nhất môn này vì có nhiều ý tưởng để thực hiện nhưng chỉ biết làm trên VC6 thôi. Để giờ thử viết trên .NET xem sao :)

Hình đại diện của người dùng
1045007
Thành viên danh dự
Thành viên danh dự
Bài viết: 551
Ngày tham gia: T.Hai 09/06/2008 3:35 pm
Đến từ: TP Cần Thơ
Has thanked: 2 time
Been thanked: 64 time
Liên hệ:

Re: Xử Lý Ảnh = VB.Net

Gửi bàigửi bởi 1045007 » T.Năm 11/06/2009 3:38 pm

haitu đã viết:hay, cái này làm nhớ tới học môn xử lý ảnh quá :D, hồi đó kết nhất môn này vì có nhiều ý tưởng để thực hiện nhưng chỉ biết làm trên VC6 thôi. Để giờ thử viết trên .NET xem sao :)

Em cũng mới học xong nè! nhiều ý tưởng quá hết biết viết j` luôn :D đành chơi từ A-z! nhưng ngán nổi thằng tần số :(
Xếp hình cổ điển for Android-https://play.google.com
♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀♂♀

Hình đại diện của người dùng
PhapSuXeko
Mạnh Thường Quân
Mạnh Thường Quân
Bài viết: 295
Ngày tham gia: CN 03/05/2009 7:44 pm
Đến từ: Tây Ninh
Has thanked: 1 time
Been thanked: 10 time
Liên hệ:

Re: Xử Lý Ảnh = VB.Net

Gửi bàigửi bởi PhapSuXeko » T.Ba 04/08/2009 10:52 am

Cám ơn 1045007, cái này hay lém
Trang chủ phần mềm xem ảnh ImageGlass: http://www.imageglass.org

BlackMN
Thành viên chính thức
Thành viên chính thức
Bài viết: 10
Ngày tham gia: T.Tư 04/06/2008 9:54 am

Re: Xử Lý Ảnh = VB.Net

Gửi bàigửi bởi BlackMN » T.Sáu 11/09/2009 2:39 pm

2 vấn đề mình quan tâm là convert bitmap sang jpg và resize hình, xin bạn hướng dẫn luôn nhé

Hình đại diện của người dùng
clarkkent
Mạnh Thường Quân
Mạnh Thường Quân
Bài viết: 1641
Ngày tham gia: T.Tư 16/04/2008 11:25 am
Đến từ: Chợ Lách - Bến Tre
Been thanked: 31 time
Liên hệ:

Re: Xử Lý Ảnh = VB.Net

Gửi bàigửi bởi clarkkent » T.Sáu 11/09/2009 3:00 pm

BlackMN đã viết:2 vấn đề mình quan tâm là convert bitmap sang jpg và resize hình, xin bạn hướng dẫn luôn nhé

cách đơn giản nhất viewtopic.php?f=37&t=6587 :|
• Hôm bây: www.tinsoftware.com ^ ^
Cố gắng lên...

SVPro
Thành viên năng nổ
Thành viên năng nổ
Bài viết: 58
Ngày tham gia: T.Bảy 14/06/2008 12:38 pm
Liên hệ:

Re: Xử Lý Ảnh = VB.Net

Gửi bàigửi bởi SVPro » CN 25/04/2010 9:28 pm

Cho xin source code :-<
http://svcantho.com

canh48ckcd
Thành viên chính thức
Thành viên chính thức
Bài viết: 13
Ngày tham gia: CN 09/05/2010 4:09 pm

Re: Xử Lý Ảnh = VB.Net

Gửi bàigửi bởi canh48ckcd » T.Tư 12/05/2010 11:16 am

em là lính mới mong các bac chi rõ em với trong doan code cua bác 1045007 co đoạn return bitmap,vậy ở đây bitmap là j vậy

solverpvd
Thành viên chính thức
Thành viên chính thức
Bài viết: 40
Ngày tham gia: T.Tư 14/04/2010 11:34 pm
Đến từ: (Phố cổ) Hội An - Quảng Nam
Liên hệ:

Re: Xử Lý Ảnh = VB.Net

Gửi bàigửi bởi solverpvd » T.Năm 21/04/2011 11:37 am

[quote="1045007"]3. Các phép toán trên ảnh
Trước đây mình có mail cho 1045007(van Phuc) hỏi về các phép toán trên ảnh mình viết bằng VB6 nhưng kết quả hình ảnh không được giống như 1045007 viết, bây giờ đã khắc phục được.
Tập tin đính kèm
Desktop.zip
(22.16 KiB) Đã tải 702 lần

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Re: Xử Lý Ảnh = VB.Net

Gửi bàigửi bởi vo_minhdat2007 » T.Tư 11/05/2011 7:46 pm

Dạo này ít thấy anh 1045007 online, không biết anh có thường vào diễn đàn không, cho em hỏi câu này chút:

Em đang cần tạo body cho các Sprite để dùng Physics World (của Box2D). Để tiện lợi thì em tạo chương trình auto-generate. Mục đích thì vẫn là đưa về đa giác gần tròn chấp nhận được. Ý tưởng của em thế này:

- Chuyển hết về ảnh trắng đen (có 1 mức alpha0 cho trước, nếu alpha > alpha0 thì cho đen, còn lại là trắng).
- Bắt đầu tạo các điểm ở vùng biên giữa vùng đen và vùng trắng.

Nhưng vấn đề là em không biết làm sao xác định được những điểm đó như thế nào, hình như lại đưa về bài toán tìm bao khung? Thêm nữa là có lẽ phải giới hạn số điểm tối đa, vì nhiều điểm quá thì lại chậm!

Hình đại diện của người dùng
1045007
Thành viên danh dự
Thành viên danh dự
Bài viết: 551
Ngày tham gia: T.Hai 09/06/2008 3:35 pm
Đến từ: TP Cần Thơ
Has thanked: 2 time
Been thanked: 64 time
Liên hệ:

Re: Xử Lý Ảnh = VB.Net

Gửi bàigửi bởi 1045007 » T.Năm 26/05/2011 3:27 am

ái chà! có nhiều người tìm mình đến thế!
Không biết cu Đạt giải quyết được chưa, a thì chỉ online 2-3h khuya ( :D ), có vào 4rum nhưng xem thôi. Cái của Đạt thì mới đọc, a nghĩ dùng 1 mask laplace thì giải quyết được rồi, đưa vào 1 cái bánh bao thì sẽ lấy được cái viền được ngay!
Bây giờ thì a rất là buồn ngũ (:| , nếu Đạt còn cần mai anh sẽ post cái nỳ.

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Re: Xử Lý Ảnh = VB.Net

Gửi bàigửi bởi vo_minhdat2007 » T.Năm 26/05/2011 7:11 am

Vâng, anh post giúp em nha :D

Edit: Em có Google để xem qua sơ sơ, thấy nó cũng là 1 thuật toán Edge Detection. Không biết anh có cách xử lí thêm không, chứ ở đây em chưa phải là tìm 1 đường viền thôi, mà làm sao từ viền đó em sẽ tạo thành những đường thẳng chấp nhận được để tạo ra khung của hình đó.

Hình đại diện của người dùng
1045007
Thành viên danh dự
Thành viên danh dự
Bài viết: 551
Ngày tham gia: T.Hai 09/06/2008 3:35 pm
Đến từ: TP Cần Thơ
Has thanked: 2 time
Been thanked: 64 time
Liên hệ:

Re: Xử Lý Ảnh = VB.Net

Gửi bàigửi bởi 1045007 » T.Sáu 27/05/2011 1:25 am

Nói chúng cái này của anh nó chỉ xử lý đến vầy thôi:
kq.jpg


Còn cái khung thì anh chưa làm tới, trong thời gian ngắn này anh code cũng ko ra :D ,
Đạt thử code này rồi nghiên cứu thêm xem.
test.rar
(85.72 KiB) Đã tải 1187 lần


Quay về “[.NET] Bài viết hướng dẫn”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.4 khách