Chủ Nhật, 9 tháng 2, 2014

Phân tích xử lý ảnh

Đại học Điện Lực
nghĩ rằng điều này sẽ liên quan đến đơn giản là tổng hợp các giá trị màu sắc và cách chia
bởi ba ba, nhưng điều này không có hiệu lực mức độ mà mắt của chúng tôi rất nhạy cảm
với màu sắc khác nhau. Các cân đối chính xác được sử dụng trong các mã sau:
(
byte * P = (byte *) (void *) Scan0;
int nOffset = stride - b.Width * 3;
byte đỏ, xanh lá, xanh;
vì(int y = 0; y <b.Height; + + y)
(
vì(int x = 0; x <b.Width; + + x)
(
màu xanh = p [0];
màu xanh lá cây = p [1];
đỏ = p [2];
p [0] = P [1] = P [2] = (byte) (.299 * Đỏ
+.587 * Xanh
+.114 * Màu xanh);
p + = 3;
)
p + = nOffset;
)
)
Như bạn thấy, chúng tôi đang iterating thông qua các dòng b.Width lần, và bước qua con
trỏ trong số gia của 3, chiết xuất các giá trị đỏ, xanh lá cây và màu xanh riêng. Nhớ lại rằng
chúng tôi được kéo ra khỏi các giá trị BGR, không rgb. Sau đó, chúng tôi áp dụng công
thức của chúng tôi để biến chúng thành các giá trị màu xám, mà hiển nhiên là như nhau
cho màu đỏ, xanh lá cây và màu xanh lam. Kết quả cuối cùng sẽ như thế này:
Bài tập Xử lý ảnh
6
Đại học Điện Lực


c. Màu theo độ sáng (Brightness)
Phần này khá đơn giản, chỉ là cộng thêm với số màu mà ta đã chọn :
vì(int y = 0; y <b.Height; + + y)
(
vì (int x = 0; X <nWidth; + + x)
Bài tập Xử lý ảnh
7
Đại học Điện Lực
(
nVal = (int) (P [0] + NBrightness);
nếu (nVal < 0) NVal = 0;
nếu (nVal> 255) NVal = 255;
p [0] = (byte) nVal;
+ + p;
)
p + = nOffset;
)
Hai ví dụ dưới đây sử dụng các giá trị của 50 và -50 tương ứng, cả về hình ảnh ban đầu


Bài tập Xử lý ảnh
8
Đại học Điện Lực

d. Màu được chỉnh theo độ tương phản (Contrast)
Các hoạt động của tương chắc chắn là phức tạp nhất, chúng tôi đã cố gắng. Thay vì chỉ cần
chuyển tất cả các điểm ảnh trong cùng một hướng, chúng tôi hoặc là phải tăng hoặc giảm
sự khác biệt giữa các nhóm điểm ảnh. Chúng tôi chấp nhận các giá trị giữa -100 và 100,
nhưng chúng tôi lần lượt các thành đôi giữa các giá trị của 0 và 4.
nếu (nContrast <-100) trở về sai;
nếu (nContrast> 100) trở về sai;
đôi pixel = 0, Tương = (100.0 + NContrast) / 100.0;
Ngược *= tương;
Chính sách của tôi đã được trở lại sai khi giá trị không hợp lệ được thông qua tại, hơn là
kẹp cho họ, vì họ có thể là kết quả của một typo, và do đó kẹp có thể không đại diện cho
những gì đang muốn, và cũng do đó người dùng có thể tìm ra những giá trị là hợp lệ , và vì
thế có một thực tế của những gì mong đợi kết quả là giá trị nhất định có thể cung cấp cho.
Bài tập Xử lý ảnh
9
Đại học Điện Lực
Vòng lặp của chúng tôi xử lý từng màu trong lặp một, mặc dù nó không cần thiết trong
trường hợp này để làm điều đó như vậy.
đỏ = p [2];

pixel = red/255.0;
pixel -= 0.5;
pixel *= tương;
pixel + = 0.5;
pixel *= 255;
nếu (pixel < 0) Pixel = 0;
nếu (pixel> 255) Pixel = 255;
p [2] = (byte) Pixel;
Chúng tôi lần lượt các điểm ảnh vào một giá trị từ 0 đến 1, và trừ 0,5. Kết quả có được một
giá trị tiêu cực cho pixel nên tối tăm, và tích cực cho các giá trị, chúng tôi muốn làm sáng.
Chúng ta nhân giá trị này bằng giá trị tương phản của chúng tôi, sau đó đảo ngược quá
trình. Cuối cùng, chúng tôi kẹp kết quả để đảm bảo nó là một giá trị màu hợp lệ. Các hình
ảnh sau đây sử dụng các giá trị tương phản của 30 và -30 tương ứng.
Bài tập Xử lý ảnh
10
Đại học Điện Lực


Bài tập Xử lý ảnh
11
Đại học Điện Lực

e. Chỉnh màu theo ý thích
Nó rất đơn giản - nó chỉ cần thêm hoặc subracts một giá trị cho mỗi màu. Điều hữu ích
nhất để làm với bộ lọc này là để đặt hai màu để -255 để dải họ và xem một trong những
thành phần màu sắc của một hình ảnh. Tôi tưởng tượng của bây giờ bạn muốn biết chính
xác những gì mà mã số sẽ giống như thế, vì vậy tôi sẽ cung cấp cho bạn những màu đỏ,
xanh lá cây và màu xanh thành phần của con trai tôi để kết thúc với. Tôi hy vọng bạn sẽ
tìm thấy bài viết này cung cấp thông tin, tiếp theo sẽ bao gồm các bộ lọc convolution, như
phát hiện cạnh, làm mịn.
Bài tập Xử lý ảnh
12
Đại học Điện Lực


Bài tập Xử lý ảnh
13
Đại học Điện Lực

2. Làm mịn ảnh (Smooth)
Trước hết chúng ta cần phải thiết lập một khuôn khổ mà từ đó để viết các bộ lọc này, nếu
không chúng ta sẽ tìm thấy chính mình bằng văn bản cùng mã trên và một lần nữa Khi bộ
lọc của chúng tôi bây giờ xung quanh dựa vào các giá trị để có được một kết quả., Chúng
tôi sẽ cần một nguồn và một bitmap đích. Tôi có xu hướng tạo ra một bản sao của bitmap
sắp tới tại và sử dụng các bản sao như là nguồn, vì nó là một trong những việc loại bỏ cuối
cùng. Để tạo thuận lợi này, tôi xác định một lớp ma trận như sau:
công cộng lớp ConvMatrix
(
công cộng int TopLeft = 0, TopMid = 0, TopRight = 0;
công cộng int MidLeft = 0, Pixel = 1, MidRight = 0;
công cộng int BottomLeft = 0, BottomMid = 0, BottomRight = 0;
công cộng int Yếu tố = 1;
Bài tập Xử lý ảnh
14
Đại học Điện Lực
công cộng int Offset = 0;
công cộng void SetAll (int nVal)
(
TopLeft = TopMid = TopRight = MidLeft = Pixel = MidRight =
BottomLeft = BottomMid = BottomRight = nVal;
)
)
Tôi chắc rằng bạn nhận thấy rằng nó là một ma trận sắc theo mặc định. Tôi cũng xác định
một phương thức tập hợp tất cả các yếu tố của ma trận với giá trị như nhau.
Mã pixel được chế biến phức tạp hơn so bài viết trước của chúng tôi, bởi vì chúng tôi cần
để truy cập vào chín điểm ảnh, và hai bitmap. Tôi làm điều này bằng cách định nghĩa hằng
số cho nhảy một và hai hàng (bởi vì chúng tôi muốn tránh những tính toán càng nhiều càng
tốt trong chính vòng lặp, chúng tôi xác định cả hai thay vì thêm một đến chính nó, hoặc
nhân bằng 2) Sau đó chúng tôi có thể sử dụng các giá trị này để viết mã của chúng tôi
Như ban đầu của chúng tôi bù đắp vào các màu sắc khác nhau là 0, 1, và 2, chúng tôi kết
thúc với 3 và 6 nhất cho mỗi người để tạo ra các giá trị trong ba chỉ số điểm ảnh trên, và sử
dụng hằng của chúng tôi để thêm hàng. Để đảm bảo chúng tôi không có bất kỳ giá trị nhảy
từ dưới của ảnh để trên, chúng ta cần để tạo ra một int, được dùng để tính toán giá trị mỗi
điểm ảnh, sau đó clamped và được lưu trữ. Sau đây là toàn bộ chức năng:
công cộng tĩnh bool Conv3x3 (Bitmap b, ConvMatrix m)
(
/ / Tránh chia cho số không lỗi
nếu (0 == M.Factor)
trở về sai; Bitmap

/ / GDI + vẫn còn nằm với chúng tôi - các định dạng trở lại là BGR, KHÔNG RGB.
bSrc = (Bitmap) b.Clone ();
BitmapData bmData = b.LockBits (mới Hình chữ nhật (0, 0, B.Width, b.Height),
ImageLockMode.ReadWrite,
PixelFormat.Format24bppRgb);
BitmapData bmSrc = bSrc.LockBits (mới Hình chữ nhật (0, 0, BSrc.Width, bSrc.Height),
ImageLockMode.ReadWrite,
PixelFormat.Format24bppRgb);
int stride = bmData.Stride;
int stride2 = stride * 2;
Hệ thống.IntPtr Scan0 = bmData.Scan0;
Hệ thống.IntPtr SrcScan0 = bmSrc.Scan0;
không an toàn (
Bài tập Xử lý ảnh
15

Xem chi tiết: Phân tích xử lý ảnh


Không có nhận xét nào:

Đăng nhận xét