Tìm vùng có hình chữ nhật thích hợp trong số các hình chữ nhật có trong ảnh?

chào các bạn , mình đang cần giải quyết 1 vấn đề như sau
mình cần tìm ra vùng chứa vân tay trong hình mặt sau của chứng minh thư

như trong hình thì vùng vân tay nằm trong hình chữ nhật bên trái, nhưng trong chứng minh thư thì lại có nhiều hình chữ nhật khác, vậy làm thế nào để tìm ra vùng có vân tay và cắt
1 số ý tưởng như , tìm biên rồi kiểm tra các hình chữ nhật, tính diện tích … hay sao đó, hoặc đo độ dài các cạnh
hoặc là đánh giá sự biến thiên lặp đi lặp lại của các mức xám, nhưng đó là ý tưởng , mình chưa cụ thể được lắm,
mong sự giúp đỡ
xincamon

@Nhu_Nguyen
may you help me?

help help help :slight_smile:

Đã nhận dạng được hình CN rồi thì xác định đâu có khó nữa :

  • Kiểm tra tỷ lệ kích thước W x H.
  • Bên trong hình CN này có vân tay, nếu dung Canny có thể sẽ cho rất nhiều đường bên => Có thể phát hiện dựa vào mật độ đường biên bên trong hình CN.
2 Likes

chào bạn(anh)
đầu tiên mình cần cắt phần ảnh có vân tay ra
mình định cắt dựa vào biên hình chữ nhật xung quanh vân tay
mình chuyển ảnh màu về ảnh xám, rồi nhị phân hóa , để nói lòi biên lên, vì ảnh cmt độ tương phản gần như chỉ có đen ( mực ) và trắng ( nền giấy)
sau đó tìm biên trên ảnh nhị phân( dễ hơn trên ảnh xám)
rồi tìm các hình chữ nhật và đánh giá hình cần chọn ,rồi lấy tọa độ lưu lại , dùng để cắt ảnh trên ảnh gốc
ý tương như vậy có được k nhỉ
mình đang làm đến bước tìm biên
nhưng tham khảo thư viện thấy 2 kiểu
1 là tìm biên, canny, laplace, gradient
2 là hàm contour tìm viền, k biết biết và viền này khác gì nhau gì?
mình k hiểu hàm contour lắm
và tìm được biên,thì tìm hình chữ nhật ntn, và đánh giá hình cần chọn ntn, mình đang mắc ở chỗ này
mọng trợ giúp
mà mình tự code các hàm xử lý ảnh
mới thử code được hàm tìm ngưỡng tự động
phân ngưỡng
chuyển ảnh xám
chạy thử thì thấy lâu quá
ảnh 2000x3000 pixel
phải mất chạy 5p mới xong

Canny để dò cạnh, mấy cái kia chắc cũng thế nhưng thuật toán khác. Contour chắc là dò đường bao 1 vùng ( chưa dùng đoán thế).
Tìm hình CN nó cũng có hàm dựng sẵn rồi.
Ảnh 2000x3000 mà 5 phút chắc thuật toán có vấn đề ở phần truy cập dữ liệu ảnh.
(Chưa biết bạn dùng ngôn ngữ gì)

2 Likes

minh dung c++
truy cập ảnh màu mình làm như sau

b = (int)anhmau.at<cv::Vec3b>(i, j)[0];
g = (int)anhmau.at<cv::Vec3b>(i, j)[1];
r = (int)anhmau.at<cv::Vec3b>(i, j)[2];

truy cập ảnh xám mình làm như sau

anhxam.at<uchar>(i, j);

cho mình hỏi thêm, như ảnh cmt trên, thì để tìm ra vùng có vân tay
nên dựa vào biên hay là dựa vào vùng có vân tay, vì khi nhị phân hóa lên, thì vân tay sẽ là vùng đen nhất ảnh

help help diễn đàn mình ít ng theo về xử lý ảnh nhỉ

Bạn truy cập dữ liệu ảnh từng byte qua hàm như thế sẽ rất lâu.
Bạn phải lấy được con trỏ dữ liệu ảnh (là imageData trong MiplImage) rồi thao tác trên con trỏ này thì mới nhanh được.
Dễ thấy vùng vân tay có đặc điểm:

  • nhiều biên ảnh nhất
  • đen nhất
    Còn lại thuật toán dựa vào những đặc điểm trên:
    Tìm vùng đen nhất,
    Tìm vùng nhiều biên nhất.
1 Like

chuyển ảnh xám, với nhị phân ngưỡng,mình dùng hàm có sẵn trong opencv rồi, hàm có sẵn cũng được code tối ưu hơn
bạn có thể nói rõ về làm ntn đẻ tìm được vùng đen nhất hoặc nhiều biên nhất không
mình chỉ tính được đến đoạn
với tìm vùng đen nhất
thì nhị phân lên,rồi kiêm tra vùng nào có giá trị cao nhất ( nhưng làm thế nào để đánh giá được cả 1 vùng và khoanh vùng) với nhị phân với ngưỡng bn,nhị phân ảnh với ngưỡng cứng hay ngưỡng tự động, vì với ngưỡng cứng thì mỗi ảnh 1 khác, k thể dùng 1 ngưỡng cố định được, còn ngưỡng tự động với hàm có sẵn thì nó ra kết quả k thấy được vùng có tần số cao
với tìm biên nhiều nhất, cũng tương tự,dùng thuật toán tìm biên để lòi biên lên,nhưng làm thế nào để đánh giá được 1 vùng nhiều viên và khoanh vùng lấy tọa độ,
mình mới nhập môn xử lý ảnh còn lơ tơ mơ,
mong trợ giúp
xincamon :slight_smile:

mục đích của mình công đoạn này là tìm ra tọa độ và kích thước của vùng có vân tay
và sau đó cắt trên ảnh xám gốc

Hi bạn,

Dạo này bận quá. Về hàm findContours thì bạn đọc cái này nhé.

Finds contours in a binary image.

C++: void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset=Point())
C++: void findContours(InputOutputArray image, OutputArrayOfArrays contours, int mode, int method, Point offset=Point())
Python: cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]]) → contours, hierarchy
C: int cvFindContours(CvArr* image, CvMemStorage* storage, CvSeq** first_contour, int header_size=sizeof(CvContour), int mode=CV_RETR_LIST, int method=CV_CHAIN_APPROX_SIMPLE, CvPoint offset=cvPoint(0,0) )
Python: cv.FindContours(image, storage, mode=CV_RETR_LIST, method=CV_CHAIN_APPROX_SIMPLE, offset=(0, 0)) → contours
Parameters:	
image – Source, an 8-bit single-channel image. Non-zero pixels are treated as 1’s. Zero pixels remain 0’s, so the image is treated as binary . You can use compare() , inRange() , threshold() , adaptiveThreshold() , Canny() , and others to create a binary image out of a grayscale or color one. The function modifies the image while extracting the contours. If mode equals to CV_RETR_CCOMP or CV_RETR_FLOODFILL, the input can also be a 32-bit integer image of labels (CV_32SC1).
contours – Detected contours. Each contour is stored as a vector of points.
hierarchy – Optional output vector, containing information about the image topology. It has as many elements as the number of contours. For each i-th contour contours[i] , the elements hierarchy[i][0] , hiearchy[i][1] , hiearchy[i][2] , and hiearchy[i][3] are set to 0-based indices in contours of the next and previous contours at the same hierarchical level, the first child contour and the parent contour, respectively. If for the contour i there are no next, previous, parent, or nested contours, the corresponding elements of hierarchy[i] will be negative.
mode –
Contour retrieval mode (if you use Python see also a note below).

CV_RETR_EXTERNAL retrieves only the extreme outer contours. It sets hierarchy[i][2]=hierarchy[i][3]=-1 for all the contours.
CV_RETR_LIST retrieves all of the contours without establishing any hierarchical relationships.
CV_RETR_CCOMP retrieves all of the contours and organizes them into a two-level hierarchy. At the top level, there are external boundaries of the components. At the second level, there are boundaries of the holes. If there is another contour inside a hole of a connected component, it is still put at the top level.
CV_RETR_TREE retrieves all of the contours and reconstructs a full hierarchy of nested contours. This full hierarchy is built and shown in the OpenCV contours.c demo.
method –
Contour approximation method (if you use Python see also a note below).

CV_CHAIN_APPROX_NONE stores absolutely all the contour points. That is, any 2 subsequent points (x1,y1) and (x2,y2) of the contour will be either horizontal, vertical or diagonal neighbors, that is, max(abs(x1-x2),abs(y2-y1))==1.
CV_CHAIN_APPROX_SIMPLE compresses horizontal, vertical, and diagonal segments and leaves only their end points. For example, an up-right rectangular contour is encoded with 4 points.
CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS applies one of the flavors of the Teh-Chin chain approximation algorithm. See [TehChin89] for details.
offset – Optional offset by which every contour point is shifted. This is useful if the contours are extracted from the image ROI and then they should be analyzed in the whole image context.
The function retrieves contours from the binary image using the algorithm [Suzuki85]. The contours are a useful tool for shape analysis and object detection and recognition. See squares.c in the OpenCV sample directory.

Note Source image is modified by this function. Also, the function does not take into account 1-pixel border of the image (it’s filled with 0’s and used for neighbor analysis in the algorithm), therefore the contours touching the image border will be clipped.
Note If you use the new Python interface then the CV_ prefix has to be omitted in contour retrieval mode and contour approximation method parameters (for example, use cv2.RETR_LIST and cv2.CHAIN_APPROX_NONE parameters). If you use the old Python interface then these parameters have the CV_ prefix (for example, use cv.CV_RETR_LIST and cv.CV_CHAIN_APPROX_NONE).
Note
An example using the findContour functionality can be found at opencv_source_code/samples/cpp/contours2.cpp
An example using findContours to clean up a background segmentation result at opencv_source_code/samples/cpp/segment_objects.cpp
(Python) An example using the findContour functionality can be found at opencv_source/samples/python2/contours.py
(Python) An example of detecting squares in an image can be found at opencv_source/samples/python2/squares.py
1 Like

Tks bạn Mình làm được qua bước đó rồi. Giờ đang đến phần tăng cường ảnh bằng gabor.mà thấy khó hiểu gabor quá

Không rành opencv lắm, chỉ convert gray, threshold cái rồi xem vùng nào lắm màu đen nhất thì chọn :stuck_out_tongue_winking_eye:

(vùng đen nhất là vùng có cái cumsum bé nhất)

1 Like

mình làm được bước này rồi
mình nhị phân hóa xong tìm toàn bộ các contour , rồi tìm các contour hình chữ nhật, rồi chọn ra các contour to nhất rồi, đánh giá hình chữ nhật cần lấy,
ý của bạn là
tạo 1 cái mặt nạ
rồi trượt nó trên ảnh
mỗi lần trượt thì tính tổng số mức xám hoặc đếm số mức xám cao hơn ngưỡng nào đó, rồi lưu lại
lấy tọa độ có tổng cao nhât hả?
mình tìm được hình như sau

2 Likes

A post was split to a new topic: Cần giải thích đoạn code về contour

bác làm xong đề tài này chưa cho e xin lại sản phẩm vào mail [email protected] để tham khảo với ạ, e xin cảm ơn và hậu tạ

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