2011-09-14 79 views
10

Tôi đang làm việc trên hình ảnh màu trắng & màu đen giống như hình ảnh đầu tiên từ liên kết: http://imageshack.us/g/33/firstwm.png/ Nó có rất nhiều "nhiễu", vì vậy tôi đã áp dụng bộ lọc trung bình để làm mịn nó.Làm thế nào để tôi làm mịn các đường cong (đường nét) trong OpenCV?

cvSmooth(TempImage, TempImage, CV_MEDIAN, 5, 0); 

Sau khi tôi lấy đường nét và vẽ chúng trên một hình ảnh khác như ảnh thứ 3 từ liên kết. Vấn đề của tôi là các đường nét vẫn còn một chút pixelated (sắc sảo). Có cách nào để làm mịn hình ảnh B & W hơn nữa để có được đường nét tốt hơn không? Hoặc có thể làm điều gì đó với các đường nét. Tôi cũng đã thử Dilate và Erode với các hạt nhân khác nhau nhưng vấn đề vẫn giữ nguyên. Cảm ơn bạn vì bất kỳ điều gì hữu ích.

EDIT: Cũng thử:

cvSmooth(TempImage, TempImage, CV_GAUSSIAN, 9, 9, 3); 
cvThreshold(TempImage, TempImage, 127, 255, CV_THRESH_BINARY); 

kết quả tương tự như bộ lọc trung bình, ok, nhưng vẫn để lại một số đường nét pixelated.

+1

Đi qua nó thông qua một hạt nhân Gaussian, và sau đó ngưỡng nó nên smoothen ra các cạnh. Có lẽ đây là kết quả bạn muốn? – swalog

+0

Tôi đang giả định rằng "tiếng ồn" mà bạn đang nói đến là các thành phần tần số cao mà bạn dường như đã loại bỏ trong ví dụ thứ hai của mình. [This] (http://i.imgur.com/33GIT.png) là một đầu ra mong muốn? Nếu chỉ mong muốn đầu ra nhị phân, [ngưỡng cứng] (http://i.imgur.com/VelRg.png) sẽ là điều gần nhất. – swalog

+0

Có, đầu ra mong muốn là để loại bỏ tiếng ồn như có đường nét mượt mà nhất có thể, tôi đã thử ngưỡng Gaussian + cũng theo gợi ý của bạn nhưng nhận được kết quả tương tự như bộ lọc trung bình. – Adrian

Trả lời

8

enter image description here

Nếu đây là kết quả làm mịn bạn sau đó, nó có thể thu được bằng cách thực hiện một Gaussian blur, tiếp theo là một ngưỡng. I E. sử dụng cvSmooth với CV_GAUSSIAN làm người bán hàng. Tiếp theo là cvThreshold.

Nếu bạn muốn chuyển tiếp mượt mà hơn là đập (như this), bạn có thể nhận điều đó với các mức điều chỉnh (ánh xạ lại phạm vi màu để bạn duy trì một số chuyển tiếp cạnh).

cập nhật Để giải thích cách có được cạnh mịn (chống răng cưa) trên móng tay, hãy xem xét những gì mà bản vẽ làm. Về cơ bản nó xử lý từng pixel trong hình ảnh, mỗi lần một pixel. Nếu giá trị pixel thấp hơn ngưỡng, nó được đặt thành màu đen (0), nếu không được đặt thành màu trắng (255).

Toán tử ngưỡng do đó rất đơn giản, tuy nhiên, có thể sử dụng bất kỳ chức năng ánh xạ chung nào khác. Về cơ bản, đó là hàm f(i), trong đó i là giá trị pixel cường độ (dao động 0-255) và f(i) là giá trị được ánh xạ. Đối với ngưỡng hàm này là đơn giản

f(i) = { 0, for i < threshold 
      255, for i >= threshold 

một hình ảnh mịn (bằng cách sử dụng một hạt nhân cvSmooth Gaussian, mang đến cho bạn sự "mượt mà" làm mịn, nếu điều đó làm cho tinh thần) Những gì bạn có được. Vì vậy, bạn có một chuyển tiếp mềm của các giá trị trên các cạnh, từ 0 đến 255. Những gì bạn muốn làm là làm cho quá trình chuyển đổi này nhỏ hơn nhiều, để bạn có được một lợi thế tốt. Nếu bạn đi đạn đạo trên nó, bạn đi trực tiếp từ 0 đến 255, giống như cú pháp nhị phân bạn đã làm.

Bây giờ, hãy xem xét một hàm bản đồ, có thể là một dải giá trị cường độ 4 (127 + - 4) với phạm vi đầy đủ 0-255. I E.

  f(i) = { 0, for i < 123 
        255, for i >= 131 
     linear mapping, for 123 <= i < 131 

Và bạn nhận được kết quả mong muốn. Tôi sẽ xem xét nhanh và xem liệu nó đã được triển khai trong openCV chưa. Không nên quá khó để mã nó cho mình mặc dù.

cập nhật 2 Phiên bản đường viền sẽ là một cái gì đó như thế này:

   f(i) = { 255, for  i < 122 
    linear mapping (255->0), for 122 <= i < 126 
         0, for 126 <= i < 127 
    linear mapping (0->255), for 127 <= i < 131 
         255, for 131 <= i 
+0

Ồ, tôi hiểu bây giờ những gì bạn đang nói, cho rằng tôi có thể sử dụng cvLUT thay vì cvThreshold. Nhưng bây giờ tôi nghĩ về nó sau khi áp dụng các cvFindContours để có được các đường nét tôi sẽ trở lại đường viền pixelated: (Cảm ơn phản ứng anyway, nếu trong một vài ngày không có câu trả lời tốt hơn bật lên, tôi sẽ đánh dấu của bạn như – Adrian

+0

Hãy xem xét rằng bạn có cạnh gradient mượt mà sau khi thao tác làm mịn, vẫn có thể có được hình ảnh đường viền đẹp mắt bằng cách sử dụng cvLUT và các giá trị bảng chính xác, trong đó có ba dãy, từ trắng sang đen (bắt đầu của dòng) từ màu đen sang màu đen (bên trong dòng) và từ màu đen sang màu trắng (cuối dòng) Nếu sau cùng cấu trúc như trên, tất cả các giá trị bên ngoài này cũng được ánh xạ tới màu trắng. đường viền :) – swalog

+0

Xem cập nhật 2 trong câu trả lời. Tôi cũng chỉ đoán giá trị tốt, vì vậy bạn có thể muốn chơi xung quanh với nó :) – swalog

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