Hướng dẫn change image contrast python - thay đổi độ tương phản hình ảnh python
Đối với Python, tôi chưa tìm thấy chức năng OpenCV cung cấp độ tương phản. Như những người khác đã đề xuất, có một số kỹ thuật để tự động tăng độ tương phản bằng cách sử dụng một công thức rất đơn giản. Show
Trong các tài liệu OpenCV chính thức, có ý kiến cho rằng phương trình này có thể được sử dụng để áp dụng cả độ tương phản và độ sáng cùng một lúc:
trong đó alpha tương ứng với độ tương phản và beta là độ sáng. Trường hợp khác nhau
Trong C/C ++, bạn có thể thực hiện phương trình này bằng CV :: MAT :: Convertto, nhưng chúng tôi không có quyền truy cập vào phần đó của thư viện từ Python. Để thực hiện nó trong Python, tôi khuyên bạn nên sử dụng chức năng CV :: AddWights, bởi vì nó nhanh chóng và nó tự động buộc đầu ra phải nằm trong phạm vi 0 đến 255 (ví dụ: với hình ảnh màu 24 bit, 8 bit mỗi kênh). Bạn cũng có thể sử dụng 5 như đề xuất của @Nathancy.
Công thức và mã trên nhanh chóng để viết và sẽ thay đổi độ sáng và độ tương phản. Nhưng chúng mang lại kết quả khác biệt đáng kể so với các chương trình chỉnh sửa ảnh. Phần còn lại của câu trả lời này sẽ mang lại kết quả sẽ tái tạo hành vi trong GIMP và độ sáng và độ tương phản của libreoffice. Đó là nhiều dòng mã hơn, nhưng nó cho kết quả tốt đẹp. Tương phảnTrong GIMP, mức độ tương phản đi từ -127 đến +127. Tôi đã điều chỉnh các công thức từ đây để phù hợp với phạm vi đó.
Để tìm ra độ sáng, tôi đã tìm ra mối quan hệ giữa độ sáng và mức độ và thông tin được sử dụng trong bài đăng cấp này để đi đến một giải pháp.
độ sáng và độ tương phản trong python và opencvĐặt tất cả lại với nhau và thêm bằng cách sử dụng hình ảnh "Mandrill" tham chiếu từ USC SIPI:
Tôi đã xử lý thủ công các hình ảnh trong GIMP và thêm các thẻ văn bản trong Python/OpenCV: Lưu ý: @utkarshbhardwaj đã đề xuất rằng người dùng Python 2.x phải chuyển mã tính toán hiệu chỉnh tương phản vào phao để nhận kết quả nổi, như vậy: @UtkarshBhardwaj has suggested that Python 2.x users must cast the contrast correction calculation code into float for getting floating result, like so: Một hình ảnh (kỹ thuật số) được tạo thành bởi nhiều phần tử gọi là pixel (hay điểm ảnh). Thường thì một hình được biểu diễn bằng một mảng hai chiều gồm nhiều pixels. Mỗi pixel (cụ thể là hình RGB) mang trong mình 3 thông số màu: Red, Green, Blue.Red, Green, Blue. Ngoài ra, đối với không gian RGBA thì nó có một kênh thứ 4 là Alpha, trong đó Alpha là một thông số chỉ độ trong suốt của pixel đó.Alpha, trong đó Alpha là một thông số chỉ độ trong suốt của pixel đó. Như đã nói ở trên, một pixel mang 3 giá trị màu, vì trên thực tế mỗi pixel được cấu thành bao gồm 3 sub-pixels. Và pixel cũng không có kích thước vật lý cụ thể, mà nó phụ thuộc vào pixel density. Mỗi pixel chứa được 256 (0-255) giá trị, cho nên về mặt lý thuyết 3 sub-pixels hiện thị được 256^3 = 16777216 (~16 triệu màu). Nhưng tất nhiên là mắt người chưa hẳn đã phân biệt được 16 triệu màu này.kích thước vật lý cụ thể, mà nó phụ thuộc vào pixel density. Mỗi pixel chứa được 256 (0-255) giá trị, cho nên về mặt lý thuyết 3 sub-pixels hiện thị được 256^3 = 16777216 (~16 triệu màu). Nhưng tất nhiên là mắt người chưa hẳn đã phân biệt được 16 triệu màu này. Xử lý hình ảnh bằng Pillow và OpenCVTrong toàn bài này mình sẽ sử dụng ảnh này làm ảnh gốc để chỉnh sửa. Phần code có hơi mì ăn liền cho nên bạn nào khó tính vui lòng bỏ qua. 1. Chuyển ảnh màu sang grayscaleVề cơ bản thì grayscale (hình trắng đen) là loại ảnh mà tất cả pixels chỉ mang thông tin về độ sáng, hay nói cách khác chỉ thể hiện các sắc thái của màu xám (Luminance mode). Trong không gian màu RGB, thì màu xám là màu mà các sắc tố Red, Green, Blue có giá trị bằng nhau. Ví dụ màu đỏ là 6 thì nếu ta muốn chuyển nó sang xám thì lấy giá trị trung bình của 3 sub-pixels và tạo thành 1 pixel mới 7Red, Green, Blue có giá trị bằng nhau. Ví dụ màu đỏ là
6 thì nếu ta muốn chuyển nó sang xám thì lấy giá trị trung bình của 3 sub-pixels và tạo thành 1 pixel mới 71.1 Code thủ côngĐầu tiên chúng ta áp dụng lý thuyết ở trên để sửa từng pixel cho ảnh gốc để tạo ra ảnh mới:
Chúng ta có ảnh gốc được chuyển thành grayscale như sau: 1.2 Sử dụng PillowPillow là một bản fork của PIL (Python Image Library) một thư viện xử lý hình ảnh của Python. Do PIL được phát hành từ 2009 và không có cập nhật thường xuyên, cho nên PIL đã bị thay thế bở Pillow trên các bản phân phối của Debian và Ubuntu luôn. Kết quả hơi khác so code thủ công ở trên một xíu, ví dụ cái màu áo của Morty ở trên là 8 nhưng ở dưới là 92. Thay đổi độ tương phản (contrast)Để thay đổi độ tương phản của pixel bằng 0 khá đơn giản
Trong đó thì factor là một giá trị để kiểm soát độ tương phản, 1.0 là tương đương hình gốc, còn thấp hơn 1.0 là giảm độ tương phản vân vân và mây mây.
Mình cũng không rõ Pillow thay đổi độ tương phản bằng cách nào, nhưng về lý thuyết chung thì làm tăng/giảm contrast là làm tối (darkening) nhưng pixel có giá trị dưới một mức nào đó, và làm sáng (lightening) những pixels có giá trị trên một mức nào đó. Độ chênh lệch này sẽ làm tăng hay giảm sự tương phản. Các bạn có thể xem thêm công thức thay đổi độ tương phản của pixel ở đây, nhưng kết quả từ công thức này không ổn lắm nên mình không post kết quả ở đây. 3. Thay đổi độ sáng (brightness)Để thay đổi độ sáng của ảnh bằng Pillow cũng rất đơn giản, ta làm như sau:
Để thay đổi độ sáng của pixels bằng cách thủ công cũng khá đơn giản, ta chỉ cần tăng hay giảm giá trị của từng pixel là được, chỉ cần lưu ý 1 giá trị đó sao cho nó nằm trong khoảng 0-255 là được.
4. Làm mờ (Gaussian blur)Guassian blur Phương pháp làm mờ hình ảnh sử dụng Gussian function để giảm nhiễu và chi tiết trên bức ảnh. Giải thích ngắn gọn thì cái ma trận 3x3 trong hình được gọi là 2. Chúng ta áp dụng cái filter như hình cho từng pixel thì cuối cùng chúng ta sẽ có một hình đã được làm mờ. Để sẽ giải thích chi tiết ở các bài sau. 05. Làm tối 4 góc (vignette) sử dụng OpenCV và numpy 1Cơm thêmPhần này không liên quan tới xử lý hình ảnh ở trên Tìm các cạnh bằng phương pháp Canny (Canny edge detection) 2Vẽ countour của ảnhContour trong image proccesing là những đường nối những điểm liền nhau tạo thành hình dáng của vật trong ảnh (không phải contour trong trang điểm). Nó là một công cụ rất hữu ích trong nhận dạng và định danh các vật thể trong hình (object detection and recognition). 3Nhận diện gương mặt bằng OpenCVSử dụng Haar Cascade classifier của OpenCV. Tải về file haarcascade_frontalface_default.xml ở đây 4Subscribe to KoodibarGet the latest posts delivered right to your inbox |