Tôi có một số hình ảnh cắt và tôi cần hình ảnh có văn bản màu đen trên nền trắng. Đầu tiên tôi áp dụng ngưỡng thích ứng và sau đó tôi cố gắng xóa nhiễu. Mặc dù tôi đã thử rất nhiều kỹ thuật loại bỏ tiếng ồn nhưng khi hình ảnh thay đổi, các kỹ thuật tôi đã sử dụng không thành công.
Phương pháp tốt nhất để chuyển đổi màu hình ảnh thành nhị phân cho hình ảnh của tôi là ngưỡng Gaussian thích ứng. Đây là mã của tôi:
im_gray = cv2.imread["image.jpg", cv2.IMREAD_GRAYSCALE]
image = cv2.GaussianBlur[im_gray, [5,5], 1]
th = cv2.adaptiveThreshold[image,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,3,2]
Tôi cần các giá trị mượt mà, dấu phân cách thập phân [dấu chấm] và các chữ cái postfix. Tôi có thể làm cái này như thế nào?
Khi được hỏi ngày 27 tháng 5 năm 2020 lúc 11:37May 27, 2020 at 11:37
UgurcanugurcanUgurcan
3201 Huy hiệu vàng4 Huy hiệu bạc15 Huy hiệu đồng1 gold badge4 silver badges15 bronze badges
Trước khi nhị phân, cần phải điều chỉnh sự chiếu sáng không đồng nhất của nền. Ví dụ, như thế này:
import cv2
image = cv2.imread['9qBsB.jpg']
image=cv2.cvtColor[image,cv2.COLOR_BGR2GRAY]
se=cv2.getStructuringElement[cv2.MORPH_RECT , [8,8]]
bg=cv2.morphologyEx[image, cv2.MORPH_DILATE, se]
out_gray=cv2.divide[image, bg, scale=255]
out_binary=cv2.threshold[out_gray, 0, 255, cv2.THRESH_OTSU ][1]
cv2.imshow['binary', out_binary]
cv2.imwrite['binary.png',out_binary]
cv2.imshow['gray', out_gray]
cv2.imwrite['gray.png',out_gray]
Kết quả:
Đã trả lời ngày 27 tháng 5 năm 2020 lúc 17:57May 27, 2020 at 17:57
Alex Alexalex AlexAlex Alex
1.8281 Huy hiệu vàng5 Huy hiệu bạc10 Huy hiệu đồng1 gold badge5 silver badges10 bronze badges
1
Bạn có thể làm tốt hơn một chút bằng cách sử dụng chuẩn hóa phân chia trong Python/OpenCV.
Input:
import cv2
import numpy as np
# load image
img = cv2.imread["license_plate.jpg"]
# convert to grayscale
gray = cv2.cvtColor[img, cv2.COLOR_BGR2GRAY]
# blur
blur = cv2.GaussianBlur[gray, [0,0], sigmaX=33, sigmaY=33]
# divide
divide = cv2.divide[gray, blur, scale=255]
# otsu threshold
thresh = cv2.threshold[divide, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU][1]
# apply morphology
kernel = cv2.getStructuringElement[cv2.MORPH_RECT, [3,3]]
morph = cv2.morphologyEx[thresh, cv2.MORPH_CLOSE, kernel]
# write result to disk
cv2.imwrite["hebrew_text_division.jpg", divide]
cv2.imwrite["hebrew_text_division_threshold.jpg", thresh]
cv2.imwrite["hebrew_text_division_morph.jpg", morph]
# display it
cv2.imshow["gray", gray]
cv2.imshow["divide", divide]
cv2.imshow["thresh", thresh]
cv2.imshow["morph", morph]
cv2.waitKey[0]
cv2.destroyAllWindows[]
Hình ảnh phân chia:
Hình ảnh được ngưỡng:
Hình ảnh làm sạch hình thái:
Đã trả lời ngày 24 tháng 11 năm 2021 lúc 17:59Nov 24, 2021 at 17:59
fmw42fmw42fmw42
41.1k9 Huy hiệu vàng52 Huy hiệu bạc70 Huy hiệu đồng9 gold badges52 silver badges70 bronze badges
2
Tôi giả sử rằng bạn đang tiền xử lý hình ảnh cho OCR [nhận dạng ký tự quang học]
Tôi đã có một dự án để phát hiện biển số và đây là những bước tôi đã làm, bạn có thể áp dụng chúng cho dự án của bạn. Sau khi màu xám, hình ảnh, hãy thử áp dụng biểu đồ cân bằng cho hình ảnh, điều này cho phép khu vực trong hình ảnh có độ tương phản thấp hơn để đạt được độ tương phản cao hơn. Sau đó làm mờ hình ảnh để giảm nhiễu trong nền. Tiếp theo áp dụng phát hiện cạnh trên hình ảnh, đảm bảo rằng nhiễu được loại bỏ đủ vì ED dễ bị ảnh hưởng. Cuối cùng, áp dụng đóng [giãn nở sau đó xói mòn] trên hình ảnh để đóng tất cả các lỗ nhỏ bên trong các từ.
Đã trả lời ngày 27 tháng 5 năm 2020 lúc 16:28May 27, 2020 at 16:28
Yudhieshyudhieshyudhiesh
5,8953 Huy hiệu vàng12 Huy hiệu bạc39 Huy hiệu đồng3 gold badges12 silver badges39 bronze badges
1
Thay vì ăn mòn và giãn nở, bạn có thể kiểm tra điều này, về cơ bản là cả hai trong một.
kernel = cv2.getStructuringElement[cv2.MORPH_RECT, [1,2]]
morphology_img = cv2.morphologyEx[img_grey, cv2.MORPH_OPEN, kernel,iterations=1]
plt.imshow[morphology_img,'Greys_r']
MORPHOLOGICAL_TRANSFORMATIONS
Đã trả lời ngày 24 tháng 11 năm 2021 lúc 17:24Nov 24, 2021 at 17:24