So sánh ảnh với ảnh

Mọi người ơi, có cách nào để so sánh 2 ảnh khác nhau, hoặc là tìm trong 1 danh sách ảnh xem có tồn tại ảnh nào giống với ảnh có sẵn ko. Không dùng thư viện OpenCV, nếu base64 các ảnh lại rồi so sánh thì có ổn ko ạ, hay có cách nào đơn giản hơn ko ạ. Mọi người cho em ý kiến tham khảo với, cảm ơn mn! :smiley:

Nếu muốn so sánh 2 file ảnh giống hệt thì sài hash md5/sha1
Còn nếu muốn kiểm tra 2 ảnh có tương đồng ko (1 ảnh chưa nén vs 1 ảnh đã nén giảm chất lượng) thì phải sài mấy thư viện xử lý như openCV

6 Likes

So sánh 2 ảnh bất kì (ko tính chất lượng ảnh) xem 2 ảnh có hoàn toàn giống nhau ko thì ngoài openCV còn cách nào khác ko bạn ?

1 Like

OpenCV là dễ nhất rồi :D, hoặc bạn tìm được cái Computer Vision nào dễ hơn thì làm

4 Likes

hoàn toàn giống nhau thì chỉ có thể so sánh hết bytes trong đó thôi
2 tấm ảnh khác nhau 1px, hoặc màu lệch làm sao mà giống nhau hoàn toàn được
bạn nên tự định nghĩa lại “như thế nào là giống nhau” trước rồi hãy bắt đầu làm

1 với 1.00000001 nó cũng khác nhau rồi, phải định nghĩa là lệnh nhau không quá bao nhiêu thì coi như bằng nhau, ví dụ nếu lệch không quá 1/triệu thì là bằng nhau thì 2 số đó bằng nhau, còn không có yêu cầu nào rõ ràng thì làm gì cũng sai

làm lập trình fail nhất là khi không biết mình muốn/phải làm gì

4 Likes

Trước tiên phải định nghĩa thế nào là giống nhau, thế nào là khác nhau.

Tiếp sau đó là làm cách nào để tìm điểm giống và khác nhau đó.

Tiếp đến dựa vào lượng thông tin giống và khác để phán định nó giống hay khác.

Nên nhớ ảnh chỉ là một mảng byte.

4 Likes

Mình thấy có một số công ty họ đang dùng trí tuệ thiên tạo để làm việc này trước khi áp dụng trí tuệ nhân tạo.

Họ dùng một mạng lưới thuê người khắp thế giới với giá rẻ, gần gần giống kiểu reCAPTCHA trước đây: người ta sẽ thấy hiện lên một màn hình toàn hình ảnh và chọn hai ảnh họ xem là giống nhau và được thưởng một số điểm, tích lũy điểm đổi ra tiền. Trong một giờ, có thể một mạng lưới phân phối hiệu quả nhận diện cỡ 100 ngàn đến 1 triệu hình ảnh.

Rồi sau đó các công ty kia phát triển “máy học” kiểu gì thì mình vẫn chưa hiểu nhưng rõ ràng người nhận diện ban đầu sẽ hiệu quả hơn nhiều so với máy.

Do đó, chủ topic nên viết ứng dụng hiện ảnh lên màn hình sau khi có thuật toán nhận diện tạm là hai ảnh đó có gì đó trông giống nhau để rồi người ta sẽ click vào từng cặp ảnh giúp việc nhận diện nhanh hơn.

Còn nếu chủ topic vẫn không thể biết thế nào là hai ảnh giống nhau thì cần định nghĩa cho tường minh:

  • 2 ảnh thực ra là một ảnh nhưng một cái đen trắng, một cái ảnh màu thì giống nhau hay khác nhau, một cái cũng ảnh màu nhưng đã chỉnh sửa Photoshop để nó vàng hơn/ xanh hơn/ đỏ hơn thì giống hay khác?

  • Cũng ảnh đó nhưng lật ngược theo các chiều: gương, lộn ngược, xoay 1 góc N độ,… thì được xem là giống hay khác?

  • Cũng chính ảnh đó nhưng được lưu trữ dưới một định dạng file khác thì giống hay khác?

  • Với những ảnh không tĩnh mà động như loại animated gif thì thế nào?

Hahaha, vấn đề trở nên quá phức tạp, khiến chủ topic chỉ muốn bỏ chạy CMNR :smiley:

4 Likes

Cuối cùng vẫn phải trả lời câu hỏi thế nào là giống nhau ::))

4 Likes

2 ảnh giống nhau ở đây là 2 ảnh giống tuyệt đối, như là copy 1 cái ảnh ra rồi yêu cầu đi tìm bản gốc của nó trong những ảnh khác nhau. Điều đó làm t nghĩ đến việc đưa về base64 các ảnh để so sánh, nhưng ko được, vì encode cũng mất khá nhiều thời gian rồi, chưa kể đến so sánh.
Cảm ơn các bạn đã góp ý, qua mấy ngày tìm hiểu thì t cũng rút ra được phương án hiệu quả nhất, vẫn là dùng openCV. Không có phương pháp nào khác nhẹ hơn và hiệu quả hơn, thậm chí còn mở rộng được nữa.

đọc binary rồi so sánh dùng memcmp :smile:

4 Likes

Thích thì get size check trước nếu size bằng nhau thì check md5, sha1, việc gì cứ phải sài opencv. OpenCV chỉ dùng khi check ảnh giống tương đối, giống tuyệt đối thì ko ai đi sài :smiley:
Kiểm tra size 2 file có khi đã loại bỏ 99% trường hợp so sánh rồi

4 Likes

xài phash (perceptual hash) :V :V

có 2 loại hash cho image là image hash và perceptual hash.

image hash tính theo cách:

  • resize image xuống thành 8x8, bất chấp aspect ratio
  • chuyển 8x8 màu thành 8x8 trắng đen
  • chuyển 8x8 trắng đen thành 64-bit int:
    • tính trung bình cộng của các 8-bit pixel
    • pixel nào sáng hơn tbc thì gán bit 1, tối hơn thì gán bit 0 trong kết quả 64-bit int

rồi sau đó so sánh 2 image hash với nhau theo Hamming distance (đếm số bit tương ứng với từng vị trí giống nhau hay ko). Giống càng nhiều bit thì image càng giống nhau.

phash tương tự, nhưng phức tạp hơn 1 tí: resize thành ảnh 32x32, sau khi chuyển về trắng đen thì chạy DCT (discrete cosine transform - như kiểu nén JPEG) rồi sau đó lấy 8x8 bit top-left (có tần số thấp - như nén JPEG chất lượng mờ mờ) chuyển thành 64-bit int. Lợi thế với image hash là do phash resize thành ảnh 32x32 lớn hơn 8x8 của image hash nên độ chính xác cao hơn.


ko tìm thấy trang web “phát minh” ra phash xài link này tạm :V

8 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?