Hướng dẫn change brightness image opencv c++ - thay đổi độ sáng hình ảnh opencv c ++

Hướng dẫn trước: Thêm (pha trộn) hai hình ảnh bằng OpenCV Adding (blending) two images using OpenCV

Hướng dẫn tiếp theo: Biến đổi Fourier rời rạc Discrete Fourier Transform

Mục tiêu

Trong hướng dẫn này, bạn sẽ học cách:

  • Truy cập các giá trị pixel
  • Khởi tạo một ma trận với số không
  • Tìm hiểu những gì CV :: Saturate_cast làm và tại sao nó hữu ích
  • Nhận một số thông tin thú vị về các phép biến đổi pixel
  • Cải thiện độ sáng của một hình ảnh trên một ví dụ thực tế

Học thuyết

Notethe Giải thích dưới đây thuộc về cuốn sách Tầm nhìn máy tính: Thuật toán và ứng dụng của Richard Szeliski

Đang xử lý hình ảnh

  • Toán tử xử lý hình ảnh chung là một hàm có một hoặc nhiều hình ảnh đầu vào và tạo ra một hình ảnh đầu ra.
  • Biến đổi hình ảnh có thể được xem là:
    • Toán tử điểm (biến đổi pixel)
    • Các nhà khai thác khu vực (dựa trên khu vực)

Pixel biến đổi

  • Trong loại biến đổi xử lý hình ảnh này, mỗi giá trị của pixel đầu ra chỉ phụ thuộc vào giá trị pixel đầu vào tương ứng (cộng, có khả năng, một số thông tin hoặc thông tin được thu thập trên toàn cầu).
  • Ví dụ về các nhà khai thác như vậy bao gồm độ sáng và điều chỉnh độ tương phản cũng như điều chỉnh màu sắc và biến đổi.

Điều chỉnh độ sáng và độ tương phản

  • Hai quy trình điểm thường được sử dụng là nhân và bổ sung với hằng số:

    \ [g (x) = \ alpha f (x) + \ beta \]

  • Các tham số \ (\ alpha> 0 \) và \ (\ beta \) thường được gọi là tham số mức tăng và sai lệch; Đôi khi các tham số này được cho là kiểm soát độ tương phản và độ sáng tương ứng.
  • Bạn có thể nghĩ về \ (f (x) \) dưới dạng pixel hình ảnh nguồn và \ (g (x) \) dưới dạng pixel hình ảnh đầu ra. Sau đó, thuận tiện hơn, chúng ta có thể viết biểu thức như:

    \ [g (i, j) = \ alpha \ cdot f (i, j) + \ beta \]

    trong đó \ (i \) và \ (j \) chỉ ra rằng pixel nằm ở cột thứ i và cột thứ j.

Mã số

Giải trình

  • Chúng tôi tải một hình ảnh bằng CV :: Imread và lưu nó trong một đối tượng MAT:
  • Bây giờ, vì chúng tôi sẽ thực hiện một số biến đổi cho hình ảnh này, chúng tôi cần một đối tượng Mat mới để lưu trữ nó. Ngoài ra, chúng tôi muốn điều này có các tính năng sau:
    • Giá trị pixel ban đầu bằng 0
    • Cùng kích thước và loại với hình ảnh gốc

Chúng tôi quan sát rằng CV :: mat :: zeros trả về trình khởi tạo không theo kiểu MATLAB dựa trên Image.Size () và Image.Type ()

  • Bây giờ chúng tôi yêu cầu các giá trị của \ (\ alpha \) và \ (\ beta \) được người dùng nhập:
  • Bây giờ, để thực hiện thao tác \ (g (i, j) = \ alpha \ cdot f (i, j) + \ beta \), chúng tôi sẽ truy cập vào mỗi pixel trong hình ảnh. Vì chúng tôi đang hoạt động với hình ảnh BGR, chúng tôi sẽ có ba giá trị trên mỗi pixel (B, G và R), vì vậy chúng tôi cũng sẽ truy cập chúng một cách riêng biệt. Đây là đoạn mã:

Chú ý những điều sau (chỉ mã C ++):C++ code only):

  • Để truy cập từng pixel trong hình ảnh chúng tôi đang sử dụng cú pháp này: Image.at (y, x) [c] trong đó y là hàng, x là cột và c là b, g hoặc r (0, 1 hoặc 2).
  • Vì hoạt động \ (\ alpha \ cdot p (i, j) + \ beta \) có thể đưa các giá trị ra khỏi phạm vi hoặc không số nguyên (nếu \ (\ alpha \) là nổi), chúng tôi sử dụng CV :: Saturat_cast để đảm bảo các giá trị là hợp lệ.
  • Cuối cùng, chúng tôi tạo Windows và hiển thị hình ảnh, cách thông thường.
NoteInstead của việc sử dụng các vòng lặp để truy cập vào từng pixel, chúng tôi có thể chỉ cần sử dụng lệnh này:for loops to access each pixel, we could have simply used this command:

Trong đó CV :: mat :: ConvertTo sẽ thực hiện hiệu quả*new_image = a*hình ảnh + beta*. Tuy nhiên, chúng tôi muốn chỉ cho bạn cách truy cập từng pixel. Trong mọi trường hợp, cả hai phương thức đều cho cùng một kết quả nhưng Convertto được tối ưu hóa hơn và hoạt động nhanh hơn rất nhiều.

Kết quả

  • Chạy mã của chúng tôi và sử dụng \ (\ alpha = 2.2 \) và \ (\ beta = 50 \)

    $ ./Basiclineartransforms lena.jpg

    Biến đổi tuyến tính cơ bản

    -----------------------------

    * Nhập giá trị alpha [1.0-3.0]: 2.2

    * Nhập giá trị beta [0-100]: 50

  • Chúng tôi nhận được điều này:

    Hướng dẫn change brightness image opencv c++ - thay đổi độ sáng hình ảnh opencv c ++

Ví dụ thực tế

Trong đoạn này, chúng ta sẽ đưa vào thực tế những gì chúng ta đã học được để điều chỉnh một hình ảnh thiếu sáng suốt bằng cách điều chỉnh độ sáng và độ tương phản của hình ảnh. Chúng ta cũng sẽ thấy một kỹ thuật khác để điều chỉnh độ sáng của một hình ảnh gọi là hiệu chỉnh gamma.

Điều chỉnh độ sáng và độ tương phản

Hai quy trình điểm thường được sử dụng là nhân và bổ sung với hằng số:

Hướng dẫn change brightness image opencv c++ - thay đổi độ sáng hình ảnh opencv c ++

\ [g (x) = \ alpha f (x) + \ beta \]

Các tham số \ (\ alpha> 0 \) và \ (\ beta \) thường được gọi là tham số mức tăng và sai lệch; Đôi khi các tham số này được cho là kiểm soát độ tương phản và độ sáng tương ứng.

Bạn có thể nghĩ về \ (f (x) \) dưới dạng pixel hình ảnh nguồn và \ (g (x) \) dưới dạng pixel hình ảnh đầu ra. Sau đó, thuận tiện hơn, chúng ta có thể viết biểu thức như:

Hướng dẫn change brightness image opencv c++ - thay đổi độ sáng hình ảnh opencv c ++

Màu xám nhạt, biểu đồ của hình ảnh gốc, màu xám đen khi độ tương phản <0 trong gimp

Lưu ý rằng các biểu đồ này đã thu được bằng cách sử dụng công cụ tương phản độ sáng trong phần mềm GIMP. Công cụ độ sáng phải giống hệt với các tham số sai lệch \ (\ beta \) nhưng công cụ tương phản dường như khác với mức tăng \ (\ alpha \) trong đó phạm vi đầu ra dường như được tập trung với GIMP (như bạn có thể nhận thấy trong biểu đồ).

Nó có thể xảy ra khi chơi với độ lệch \ (\ beta \) sẽ cải thiện độ sáng nhưng đồng thời hình ảnh sẽ xuất hiện với một tấm màn nhẹ vì độ tương phản sẽ giảm. Mức tăng \ (\ alpha \) có thể được sử dụng để giảm hiệu ứng này nhưng do độ bão hòa, chúng ta sẽ mất một số chi tiết trong các vùng sáng ban đầu.

Chỉnh sửa Gamma

Có thể điều chỉnh gamma để điều chỉnh độ sáng của hình ảnh bằng cách sử dụng phép biến đổi không tuyến tính giữa các giá trị đầu vào và các giá trị đầu ra được ánh xạ:

\ [O = \ left (\ frac {i} {255} \ right)^{\ gamma} \ lần 255 \]

Vì mối quan hệ này là phi tuyến tính, hiệu ứng sẽ không giống nhau đối với tất cả các pixel và sẽ phụ thuộc vào giá trị ban đầu của chúng.

Hướng dẫn change brightness image opencv c++ - thay đổi độ sáng hình ảnh opencv c ++

Vẽ cho các giá trị khác nhau của gamma

When \( \gamma < 1 \), the original dark regions will be brighter and the histogram will be shifted to the right whereas it will be the opposite with \( \gamma > 1 \).

Sửa một hình ảnh không được coi là

Hình ảnh sau đây đã được sửa bằng: \ (\ alpha = 1.3 \) và \ (\ beta = 40 \).

Hướng dẫn change brightness image opencv c++ - thay đổi độ sáng hình ảnh opencv c ++

Bởi Visem (công việc riêng) [CC BY-SA 3.0], thông qua Wikimedia Commons

Độ sáng tổng thể đã được cải thiện nhưng bạn có thể nhận thấy rằng các đám mây hiện đang bão hòa rất nhiều do độ bão hòa số của việc thực hiện được sử dụng (làm nổi bật trong nhiếp ảnh).

Hình ảnh sau đây đã được sửa bằng: \ (\ gamma = 0,4 \).

Hướng dẫn change brightness image opencv c++ - thay đổi độ sáng hình ảnh opencv c ++

Bởi Visem (công việc riêng) [CC BY-SA 3.0], thông qua Wikimedia Commons

Độ sáng tổng thể đã được cải thiện nhưng bạn có thể nhận thấy rằng các đám mây hiện đang bão hòa rất nhiều do độ bão hòa số của việc thực hiện được sử dụng (làm nổi bật trong nhiếp ảnh).

Hướng dẫn change brightness image opencv c++ - thay đổi độ sáng hình ảnh opencv c ++

Hình ảnh sau đây đã được sửa bằng: \ (\ gamma = 0,4 \).

Việc điều chỉnh gamma nên có xu hướng thêm hiệu ứng bão hòa ít hơn vì ánh xạ là không tuyến tính và không có độ bão hòa số có thể như trong phương pháp trước đó.

Trái: Biểu đồ sau alpha, hiệu chỉnh beta; Trung tâm: Biểu đồ của hình ảnh gốc; Phải: Biểu đồ sau khi điều chỉnh gammaThey are basic techniques and are not intended to be used as a replacement of a raster graphics editor!

Hình trước đó so sánh biểu đồ cho ba hình ảnh (các phạm vi y không giống nhau giữa ba biểu đồ). Bạn có thể nhận thấy rằng hầu hết các giá trị pixel nằm ở phần dưới của biểu đồ cho hình ảnh gốc. Sau khi hiệu chỉnh \ (\ alpha \), \ (\ beta \), chúng ta có thể quan sát một đỉnh lớn ở 255 do độ bão hòa cũng như sự thay đổi ở bên phải. Sau khi hiệu chỉnh gamma, biểu đồ được dịch chuyển sang bên phải nhưng các pixel trong các vùng tối bị dịch chuyển nhiều hơn (xem hình đường cong gamma) so với các pixel ở các vùng sáng.

Trong hướng dẫn này, bạn đã thấy hai phương pháp đơn giản để điều chỉnh độ tương phản và độ sáng của một hình ảnh. Chúng là những kỹ thuật cơ bản và không được sử dụng để thay thế trình chỉnh sửa đồ họa raster!

Mã số

Mã cho hiệu chỉnh gamma:

  • Một bảng tra cứu được sử dụng để cải thiện hiệu suất của tính toán vì chỉ có 256 giá trị cần được tính toán một lần.
  • Tài nguyên bổ sung
  • Gamma Hiệu chỉnh trong kết xuất đồ họa

Làm cách nào để thay đổi độ sáng của hình ảnh trong opencv?

Tăng độ sáng bằng OpenCV là rất dễ dàng. Để tăng độ sáng, thêm một số giá trị bổ sung với mỗi kênh và độ sáng sẽ được tăng lên. Ví dụ, hình ảnh BRG có ba kênh màu xanh (B), màu xanh lá cây (g) và đỏ (r). Điều đó có nghĩa là giá trị hiện tại của pixel sẽ là (B.add some additional values with each channel, and the brightness will be increased. For example, BRG images have three channels blue (B), green (G) and red(R). That means the current value of a pixel will be (B.

Làm thế nào để tôi điều chỉnh độ sáng và độ tương phản trong opencv?

Mat new_image = mat :: Zeros (Image.Size (), Image.Type ()) ;.
Mat newImage = mat.Zeros (Image.Size (), Image.Type ()) ;.
new_image = np.zeros (Image.Shape, Image.dtype).
Image.convertto (new_image, -1, alpha, beta) ;.
Image.convertto (NewImage, -1, alpha, beta) ;.
new_image = cv.convertscaleabs (hình ảnh, alpha = alpha, beta = beta).

Làm cách nào để thay đổi độ tương phản trên opencv?

Để thay đổi độ tương phản, nhân các giá trị pixel với một số hằng số.Ví dụ: nếu nhân tất cả các giá trị pixel của hình ảnh với 2, thì giá trị của pixel sẽ được nhân đôi và hình ảnh sẽ trông sắc nét hơn.multiply the pixel values with some constant. For example, if multiply all the pixel values of an image by 2, then the pixel's value will be doubled, and the image will look sharper.

Làm thế nào tôi có thể thay đổi độ tương phản của một bức tranh?

Trong thanh menu, chọn Hình ảnh> Điều chỉnh> Độ sáng/độ tương phản.Điều chỉnh thanh trượt độ sáng để thay đổi độ sáng tổng thể của hình ảnh.Điều chỉnh thanh trượt tương phản để tăng hoặc giảm độ tương phản hình ảnh.Adjust the Contrast slider to increase or decrease image contrast.