mevatron
Câu trả lời là một cách mà số lượng vùng màu đen được giảm thiểu trong khi giữ lại hình ảnh đầy đủ.
Một tùy chọn khác là xóa vùng màu đen hoàn chỉnh nơi bạn cũng mất một phần hình ảnh, nhưng kết quả sẽ là một hình ảnh hình chữ nhật trông gọn gàng. Dưới đây là mã Python.
Ở đây, bạn tìm thấy ba góc chính của hình ảnh như sau:
Tôi đã đánh dấu những giá trị đó. (1,x2), (x1,1), (x3,y3)
. Nó dựa trên giả định rằng hình ảnh của bạn bắt đầu từ (1,1).
Code:
bước đầu tiên là giống như mevatron
's. Làm mờ hình ảnh để loại bỏ nhiễu, đánh dấu hình ảnh, sau đó tìm đường nét.
import cv2
import numpy as np
img = cv2.imread('office.jpg')
img = cv2.resize(img,(800,400))
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray = cv2.medianBlur(gray,3)
ret,thresh = cv2.threshold(gray,1,255,0)
contours,hierarchy = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
Bây giờ, tìm đường viền lớn nhất là hình ảnh của bạn. Nó là để tránh tiếng ồn trong trường hợp nếu có (Hầu hết có lẽ sẽ không có bất kỳ). Hoặc bạn có thể sử dụng phương thức mevatron
.
max_area = -1
best_cnt = None
for cnt in contours:
area = cv2.contourArea(cnt)
if area > max_area:
max_area = area
best_cnt = cnt
Bây giờ hãy ước tính đường bao để loại bỏ các điểm không cần thiết trong giá trị đường viền được tìm thấy, nhưng nó bảo toàn tất cả các giá trị góc.
approx = cv2.approxPolyDP(best_cnt,0.01*cv2.arcLength(best_cnt,True),True)
Bây giờ chúng tôi tìm thấy các góc.
Đầu tiên, chúng tôi tìm thấy (x3, y3). Đó là điểm xa nhất. Vì vậy, x3*y3
sẽ rất lớn. Vì vậy, chúng tôi tìm thấy sản phẩm của tất cả các cặp điểm và chọn cặp với sản phẩm tối đa.
far = approx[np.product(approx,2).argmax()][0]
Tiếp theo (1, x2). Đó là điểm mà phần tử đầu tiên là một phần tử, sau đó phần tử thứ hai là tối đa.
ymax = approx[approx[:,:,0]==1].max()
Tiếp theo (x1,1). Đây là điểm mà phần tử thứ hai là 1, thì phần tử đầu tiên là tối đa.
xmax = approx[approx[:,:,1]==1].max()
Bây giờ chúng ta tìm ra minimum values in (far.x,xmax) and (far.y, ymax)
x = min(far[0],xmax)
y = min(far[1],ymax)
Nếu bạn vẽ một hình chữ nhật với (1,1) và (x, y), bạn nhận được kết quả như sau:
Vì vậy, bạn cắt hình ảnh để sửa vùng hình chữ nhật.
img2 = img[:y,:x].copy()
Dưới đây là kết quả:
See, the problem is that you lose some parts of the stitched image.
Bạn có thể có thể sử dụng cvFindContours để có được mức độ của nội dung hình ảnh của bạn và sau đó cắt vào đó ... – LiMuBei
khi thêm hình ảnh trong câu hỏi, xuất kết quả bằng cách sử dụng 'imwrite' và thêm nó. Nó là tốt hơn so với thêm ảnh chụp màn hình, bởi vì những người trả lời câu hỏi của bạn cần phải loại bỏ các vùng không mong muốn khỏi hình ảnh. –
Không gian làm việc của bạn gọn gàng. – wengseng