Chuyển đổi ảnh Màu RGB Thành ảnh Xám (grayscale)

(cập nhật ngày 13/05/2013)

Ảnh gốc ban đầu là ảnh màu RGB có giá trị màu của mỗi kênh nằm trong đoạn [0, 255]. Bài viết này hướng dẫn cách chuyển ảnh màu thành ảnh xám (grayscale) – chỉ còn 1 kênh màu gray – có giá trị màu nằm trong đoạn [0, 255].

Chuẩn bị

  • MS Visual Studio 2010, C#
  • EmguCV 2.4.2

Thực hiện

Add reference các file Emgu.CV.dll, Emgu.CV.UI.dll, Emgu.Util.dll.

Khai báo trong code

using Emgu.CV; using Emgu.CV.Structure; using Emgu.Util;

Để chuyển từ ảnh màu sang ảnh xám, ta thực hiện theo công thức sau

Độ sáng điểm ảnh = Red * 0.1140 + Green * 0.5870 + Blue * 0.2989

Các hệ số trên có thể được làm tròn tương ứng là R 0.11 – G 0.59 – B 0.3

Hàm tGrayScale dưới đây có tham số truyền vào là ảnh màu RGB, trả về ảnh xám.

public Image<Gray, Byte> tGrayScale(Image<Bgr, Byte> image) { Image<Gray, Byte> GrayImage = new Image<Gray, Byte>(image.Width, image.Height); Double color; for (int r = 0; r < GrayImage.Height; r++) { for (int c = 0; c < GrayImage.Width; c++) { color = image.Data[r, c, 0] * 0.1140 + image.Data[r, c, 1] * 0.5870 + image.Data[r, c, 2] * 0.2989; GrayImage.Data[r, c, 0] = (Byte)Math.Round(color, 0); } } return GrayImage; }

Trong đoạn mã trên, ta truy xuất đến các điểm ảnh (pixel) như sau:

image.Data[r, c, 0] : pixel tại vị trí hàng r, cột c, kênh màu red (0) image.Data[r, c, 1] : pixel tại vị trí hàng r, cột c, kênh màu green (1) image.Data[r, c, 2] : pixel tại vị trí hàng r, cột c, kênh màu blue (2)

GrayImage.Data[r, c, 0] : pixel của ảnh xám tại vị trí hàng r, cột c, chỉ có 1 kênh màu gray (0)

Do nhân với các hệ số có dấu chấm động, nên ta dùng hàm làm tròn (Math.Round() ), sau đó ép kiểu về Byte – để có được giá trị độ sáng nằm trong đoạn [0, 255].

Share this:

  • X
  • Facebook
Like Loading...

Related

Từ khóa » Chuyển ảnh Rgb Sang Gray