Ngưỡng là phương pháp phân đoạn ảnh đơn giản nhất. Đây là một hoạt động phi tuyến tính để chuyển đổi ảnh thang độ xám thành ảnh nhị phân trong đó hai mức được gán cho các pixel nằm dưới hoặc trên giá trị ngưỡng đã chỉ định. Nói cách khác, nếu giá trị pixel lớn hơn giá trị ngưỡng, nó sẽ được gán một giá trị [có thể là màu trắng], nếu không, nó sẽ được gán giá trị khác [có thể là màu đen]. Trong OpenCV, chúng tôi sử dụng cv2. hàm ngưỡng []
cv2.threshold[src, thresh, maxval, type[, dst]]
Chức năng này áp dụng ngưỡng mức cố định cho một mảng kênh đơn. Hàm này thường được sử dụng để lấy hình ảnh hai cấp độ [nhị phân] ra khỏi hình ảnh thang độ xám [ compare[] cũng có thể được sử dụng cho mục đích này] hoặc để loại bỏ nhiễu, nghĩa là lọc ra các pixel quá nhỏ hoặc quá lớn . Có một số loại ngưỡng được hỗ trợ bởi chức năng
Hàm trả về giá trị ngưỡng được tính toán và hình ảnh ngưỡng
bogotobogo. tìm kiếm trang web com
- src - mảng đầu vào [điểm nổi đơn kênh, 8 bit hoặc 32 bit]. Đây là hình ảnh nguồn, phải là hình ảnh thang độ xám
- thresh - giá trị ngưỡng và nó được sử dụng để phân loại các giá trị pixel
- maxval - giá trị tối đa để sử dụng với các loại ngưỡng THRESH_BINARY và THRESH_BINARY_INV. Nó biểu thị giá trị được cung cấp nếu giá trị pixel lớn hơn [đôi khi nhỏ hơn] giá trị ngưỡng
- loại - loại ngưỡng. [xem ngưỡng để biết chi tiết]
- cv2. THRESH_BINARY
- cv2. THRESH_BINARY_INVY
- cv2. THRESH_TRUNCY
- cv2. THRESH_TOZEROY
- cv2. THRESH_TOZERO_INVY
nguồn ảnh. ngưỡng
- dst - mảng đầu ra có cùng kích thước và loại như src
Ngưỡng - mã và đầu ra
Mã trông như thế này
import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread['gradient.png',0] ret,thresh1 = cv2.threshold[img,127,255,cv2.THRESH_BINARY] ret,thresh2 = cv2.threshold[img,127,255,cv2.THRESH_BINARY_INV] ret,thresh3 = cv2.threshold[img,127,255,cv2.THRESH_TRUNC] ret,thresh4 = cv2.threshold[img,127,255,cv2.THRESH_TOZERO] ret,thresh5 = cv2.threshold[img,127,255,cv2.THRESH_TOZERO_INV] titles = ['Original Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV'] images = [img, thresh1, thresh2, thresh3, thresh4, thresh5] for i in xrange[6]: plt.subplot[2,3,i+1],plt.imshow[images[i],'gray'] plt.title[titles[i]] plt.xticks[[]],plt.yticks[[]] plt.show[]
đầu ra
Có hình ảnh gốc.
độ dốc. png và hình tròn. png
Sử dụng giá trị ngưỡng chung có thể không phải là lựa chọn tốt khi hình ảnh có các điều kiện ánh sáng khác nhau ở các khu vực khác nhau. Vì vậy, trong trường hợp đó, chúng tôi có thể muốn sử dụng ngưỡng thích ứng. Nó sử dụng thuật toán tính toán ngưỡng cho một vùng nhỏ của hình ảnh để chúng tôi có thể nhận được các ngưỡng khác nhau cho các vùng khác nhau của cùng một hình ảnh và nó mang lại cho chúng tôi kết quả tốt hơn đối với hình ảnh với các điều kiện ánh sáng khác nhau
cv.AdaptiveThreshold[src, dst, maxValue, adaptive_method=CV_ADAPTIVE_THRESH_MEAN_C, thresholdType=CV_THRESH_BINARY, blockSize=3, param1=5]
ở đâu
- src - Nguồn hình ảnh kênh đơn 8 bit
- dst - Hình ảnh đích có cùng kích thước và cùng loại với src
- maxValue - Giá trị khác không được gán cho các pixel thỏa mãn điều kiện
- AdaptiveMethod - Thuật toán ngưỡng thích ứng để sử dụng, ADAPTIVE_THRESH_MEAN_C [giá trị ngưỡng là giá trị trung bình của khu vực lân cận] hoặc ADAPTIVE_THRESH_GAUSSIAN_C [giá trị ngưỡng là tổng trọng số của các giá trị lân cận trong đó trọng số là cửa sổ gaussian]. AdaptiveMethod quyết định cách tính giá trị ngưỡng
- ngưỡngType - Loại ngưỡng phải là THRESH_BINARY hoặc THRESH_BINARY_INV
- blockSize - kích thước của vùng lân cận pixel được sử dụng để tính giá trị ngưỡng cho pixel. 3, 5, 7, v.v.
- C - Hằng số bị trừ khỏi giá trị trung bình hoặc giá trị trung bình có trọng số. Thông thường, nó dương nhưng cũng có thể bằng 0 hoặc âm. Nó chỉ là một hằng số được trừ khỏi giá trị trung bình hoặc giá trị trung bình được tính
Đây là mã cho ngưỡng thích ứng
import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread['bw.png',0] img = cv2.medianBlur[img,5] ret,th1 = cv2.threshold[img,127,255,cv2.THRESH_BINARY] th2 = cv2.adaptiveThreshold[img,255,cv2.ADAPTIVE_THRESH_MEAN_C,\ cv2.THRESH_BINARY,11,2] th3 = cv2.adaptiveThreshold[img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\ cv2.THRESH_BINARY,11,2] titles = ['Original Image', 'Global Thresholding [v = 127]', 'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding'] images = [img, th1, th2, th3] for i in xrange[4]: plt.subplot[2,2,i+1],plt.imshow[images[i],'gray'] plt.title[titles[i]] plt.xticks[[]],plt.yticks[[]] plt.show[]
hình ảnh gốc. bw. png
Phân tách các bản phân phối lưỡng kim với ngưỡng Otsu
Otsu nhị phân hóa tự động tính toán giá trị ngưỡng từ biểu đồ hình ảnh cho hình ảnh hai chế độ
Nó sử dụng cv2. ngưỡng [] có thêm cờ, cv2. THRESH_OTSU. Đối với giá trị ngưỡng, chỉ cần vượt qua số không. Sau đó, thuật toán tìm giá trị ngưỡng tối ưu và trả về cho chúng tôi dưới dạng đầu ra thứ hai, retVal. Nếu ngưỡng Otsu không được sử dụng, retVal vẫn giống như giá trị ngưỡng chúng tôi đã sử dụng