2012-05-12 83 views
10

Tôi có một hình ảnh mà tôi đã quét, nhưng giấy trắng không có màu trắng trên màn hình. Có cách nào để cân bằng hợp đồng/độ sáng để làm cho màu nền trắng hơn không?Làm cách nào để cân bằng độ tương phản và độ sáng của hình ảnh bằng cách sử dụng opencv?

Cập nhật

Tôi đã thử chức năng Image._EqualizeHist gợi ý từ EmguCv:

string file = @"IMG_20120512_055533.jpg"; 
Image<Bgr, byte> originalColour = new Image<Bgr, byte>(file); 

Image<Bgr, byte> improved = originalColour.Clone(); 
improved._EqualizeHist(); 

Nhưng nhận được một kết quả thậm chí tồi tệ hơn (cũng có khi màu xám đầu tiên có quy mô):

Tôi có thiếu các tham số khác không?

+1

Stack Overflow cung cấp dịch vụ lưu trữ hình ảnh miễn phí, chỉ cần nhấp vào nút hình ảnh trên thanh công cụ và trỏ nó vào hình ảnh được lưu trữ cục bộ trên máy tính của bạn ở nơi khác trên web. Điều này thực sự tải lên và phản ánh một bản sao của hình ảnh, đảm bảo rằng nó sẽ luôn luôn có sẵn, ngay cả khi nguồn bên ngoài đi xuống. Tôi đã chuyển qua các hình ảnh bạn đã đăng, nhưng chỉ cần lưu ý một số điều trong tương lai. –

+0

Tôi không biết tại sao, nhưng equalizehist cho kết quả tồi tệ hơn trong trường hợp như vậy .. tôi cũng có vấn đề này đôi khi .. –

Trả lời

18

Tôi đã thảo luận một số kỹ thuật tại đây: How can I adjust contrast in OpenCV in C?

Vui lòng kiểm tra. Dưới đây là kết quả tôi nhận được khi tôi đã cố gắng hai phương pháp cuối cùng trên hình ảnh của bạn

1) Thresholding:

Thresholding đưa ra một hình ảnh nhị phân. Nếu đó là những gì bạn muốn, bạn có thể áp dụng threshold function

2) Nếu hình ảnh màu xám cần:

enter image description here

bổ sung:

Morphological closing cũng làm việc tốt trong trường hợp của bạn

img = cv2.imread('home.jpg',0) 
kernel1 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5)) 
close = cv2.morphologyEx(gray,cv2.MORPH_CLOSE,kernel1) 
div = np.float32(gray)/(close) 
res = np.uint8(cv2.normalize(div,div,0,255,cv2.NORM_MINMAX)) 

(mã bằng Python API)

quả Dưới đây:

enter image description here

+1

+1 Tôi thực sự thích câu trả lời của bạn, theo kịp công việc tốt. – karlphillip

+1

cảm ơn bạn !!!!! –

+0

@AbidRahmanK: bạn có thể vui lòng chia sẻ mã của bạn với tôi không? –

5

Nó được gọi là equalizeHist. Tôi không biết tên của nó trong emgu, nhưng kết quả phải chính xác những gì bạn cần - nền sáng hơn và văn bản tối hơn.

EDIT

Để trích xuất chỉ các cạnh (mà là rất khác so với các kỹ thuật nâng cao hình ảnh), bạn chỉ có thể áp dụng Canny. Chọn hai ngưỡng là 20 và 60, để bắt đầu và sau đó tăng (hoặc giảm chúng) giữ tỷ lệ 3: 1 giữa chúng, cho đến khi bạn có hình ảnh cạnh đẹp.

5

tôi đề nghị sử dụng AdaptiveThreshold. Nó hoạt động bằng cách thực hiện thresholding khu vực địa phương cho mỗi điểm ảnh trong hình ảnh (điều này thực sự là một vấn đề lớn khi có nền gradient, mạnh hơn một chút so với hình ảnh của bạn). Tham số blockSize là kích thước của vùng lân cận và giá trị pixel được xử lý phải lớn hơn giá trị khu vực trung bình trừ đi param1.

enter image description here

Dưới đây là làm thế nào để làm điều đó trong python (nó nên rất dễ dàng để chuyển đổi sang c):

import cv 
im = cv.LoadImage("9jU1Um.jpg", cv.CV_LOAD_IMAGE_GRAYSCALE) 
cv.AdaptiveThreshold(im, im, 255, cv.CV_ADAPTIVE_THRESH_MEAN_C, 
            cv.CV_THRESH_BINARY, blockSize=31, param1=15) 
cv.ShowImage('image', im) 
cv.WaitKey(0) 
-1

Dù bằng cách nào, bạn cũng có thể kiểm tra mỗi mỗi pixel. Đặt nó thành 0 nếu ít hơn một giá trị được xác định và đặt thành 255 nếu vượt quá giá trị xác định.

Các vấn đề liên quan