01/10/2018, 10:32
[Thực chiến] Tìm hình có diện tích lớn nhất
Đây là một bài tập tổng hợp để các code thủ luyện cơ xem mình cơ mình đã 6 múi chưa
Nhất là ai muốn theo nghiệp xử lý ảnh
Trong một bức ảnh có nhiều hình với hình dạng khác nhau. Hãy dùng mọi “thủ đoạn” mà bạn biết để tìm hình có diện tích lớn nhất. Xuất ra diện tích của hình đó (S=? pixel) và tọa độ hình đó (Xmin ? Ymin? Xmax? Y max?).
Gốc tọa độ là góc trên bên trái.
Ảnh là bitmap 24 bit.
Bắt đầu nào anh em
Bài liên quan
Đây là ảnh bmp đổi đuôi thành jpg thì phải
À, có API ăn sẵn nè các thím http://mkweb.bcgsc.ca/color-summarizer/?api
Đúng rồi, qua kiểm tra bằng lệnh
file
thì nó làmap.bmp.jpg: PC bitmap, Windows 3.x format, 800 x 600 x 24
.API đó chỉ làm việc với jpeg và png mà?
Không tính hình trắng thì hình như cái màu đỏ là hình có diện tích lớn thứ 2
RGB(237, 28, 36) = 52080
. Còn code thì đáp án đúng mới dám up mình mặt mỏng nên sợ quê lắm.Thủ đoạn mình có dùng: dùng mắt để tra google cái màu với tự so sánh rồi chọn ra số thứ 2 cho nhanh (khỏi phải code)
Thực ra thì theo cái trang web kia thì màu xanh của hình tròn là lớn nhất, 11.14%. Màu đỏ chỉ 10.73%.
Còn vụ ảnh thì mình tải ảnh về, mở paint rồi lưu thành png là xong mà. Hoặc thậm chí copy ảnh rồi paste luôn ở đây.
sử dụng opencv thì dùng contour tìm các đường viên bao quanh đối tượng, rồi sắp xếp contour giảm dần rồi chọn cái thứ 2, khi đã tìm được contour chưa hình cần tìm thì đếm số pixel trong vùng contour đó, màu thì các pixel trong 1 hình đều có cùng 1 màu thì phải , nên lấy 1 pixel trong vùng contour cần tìm, rồi lấy r,g,b :v còn làm tay thì cũng căng đấy nhỉ
:~ Chắc là duyệt từng pixel, lấy mã màu, bỏ vô hash table rồi đếm dần. Có thể làm vài biện pháp để đơn giản màu sắc lại đề phòng hình nhiều màu quá
Mà nói vậy thôi chứ không biết code
hix, cái này đếm pixel, đơn giản mà, số pixel lớn nhì là xem như diện tích lớn nhì, xài cái canvas html ấy để đồng đạo xem thử luôn…
Tư tưởng lớn gặp nhau
Nghe chừng dễ quá đổi lại cái đề cho nó “đánh võng” tý nữa.
Lại nào anh em
Ảnh ở đây là ảnh bitmap để không bị nén làm sai màu sẽ ảnh hưởng đến kết quả.
Nhưng diễn đàn không cho up bitmap nên táng thêm jpg đằng sau để lừa nó
Anh em tải về bỏ đuôi jpg đi là chiến.
DFS những ô cùng màu thôi:
##update
Sau khi download lại ảnh (đúng size) thì kết quả:
###Có màu
###Màu đỏ
Ảnh kích thước 800x600 = 480.000 pixel thôi mà.
Kết quả kia độc màu trắng đã hơn 500.000 pixel
Giờ dễ nhất là tăng constrast lên, dùng magic wand để tách thành các layer, tô cho tất cả các layer đều chỉ một màu (ví dụ 255,0,0) rồi đặt lại vị trí cũ. Có 6 shapes, vậy ta sẽ lưu thành 6 file khác nhau có cùng kích thước với hình ban đầu, mỗi file chỉ có 1 shape ở đúng vị trí của nó.
số 4 bự nhứt nhoa
Đã quy về 1 màu rồi đó bạn. Vì 6 màu nó dễ quá chắc anh em không hứng
Chưa có đáp số nè
fix lại rồi, quên check 1 điểm bị đếm lại nhiều lần
đáp số rồi đó, mảnh 4 diện tích là 52823.5 trắc trắn rầu
Sao kết quả lại có .5
hehe tui cũng loang nhưng mà loang lấy border của mỗi hình, như trong cái hình trên là đường viền màu xanh lá đó. Sau đó xài Boost.Geometry
boost::geometry::area()
để lấy diện tích hình đó, nên nó mới ra .5tại có viết cái clone Gunbound, để làm map thì mỗi piece coi như là 1 cục, mấy cái vehicle cho chạy trên cái cục đó nên chỉ cần đường viền là đủ, ko cần từng pixel một, tui viết cái tool load map chỉ cần 1 điểm trong cục đó là truy ra được đường viền của cục đó. Với hình này cho 6 điểm lấy 6 cục, rồi tính diện tích dễ dàng
hàm truy đường viền nó lấy từng pixel một trên đường viền, cho vô
boost::geometry::simplify()
cho nó bỏ bớt mấy điểm ko cần đi, tuy ko chính xác 100% nhưng cũng chính xác 99%, ví dụ mảng 2 là hcn chỉ cần 4 điểm nó lại cho ra 6 điểm, gần đúng thôi. Kết quả ra 1 cái 52k 1 cái 51k chắc chênh lệch ko nhiều đâu1 K là nhiều rồi đó. Nhỡ 1 cái 50000 , 1 cái 50010 mà lệch 1 K là toi.
Code thử phát xem nó ra bao nhiêu chứ chưa có đáp số