Xin chào các bạn, hôm nay mình sẽ giới thiệu các bạn về thư viện Opencv2, 1 thư viện rất mạnh hay sử dụng trong xử lý ảnh, đây cũng chính là thư viện mình sử chủ yếu code trong các bài tiếp theo.
Và ở đây mình sẽ code bằng ngôn ngữ python 3 trên môn trường jupyter notebook.
Setup
Mình khuyến khích các bạn sử dụng anaconda ở đó sẽ có jupyter notebook, cách settup bạn có thể tham khảo đường link sau đây.
Cài đặt thư viện opencv2:
1 2 | pip install opencv<span class="token operator">-</span>python |
Kiểm tra version:
1 2 3 4 | <span class="token keyword">import</span> cv2 cv2<span class="token punctuation">.</span>__version__ <span class="token comment">#'4.1.1'</span> |
Hoặc nếu bạn không muốn mất thời gian bạn có thể sử dụng colab
Read and display image
Ảnh mình sẽ dùng sẽ là ảnh như sau:
1 2 3 4 5 | iname <span class="token operator">=</span> <span class="token string">'lena.jpg'</span> <span class="token comment">#read image</span> img <span class="token operator">=</span> cv2<span class="token punctuation">.</span>imread<span class="token punctuation">(</span>iname<span class="token punctuation">)</span> img |
Đầu ra của img lúc này sẽ là 1 ma trận ba chiều nhưng trong phần lý thuyết RGB.
Chúng ta sẽ có câu lệnh xem shape và size của ảnh:
1 2 3 4 5 | img<span class="token punctuation">.</span>shape<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment"># output: (512, 512, 3)</span> img<span class="token punctuation">.</span>size <span class="token comment"># output: 786432</span> |
Khi display ảnh thì có 2 cách:
Cách 1 dùng hàm có sẵn trong cv2:
123<span class="token comment"># cv2.imshow(window_name, image)</span>cv2<span class="token punctuation">.</span>imshow<span class="token punctuation">(</span><span class="token string">'test'</span><span class="token punctuation">,</span> img<span class="token punctuation">)</span>Cách 2 dùng thư viện matplotlib.
12345<span class="token comment">#to display at jupyter notebook</span><span class="token keyword">import</span> matplotlib<span class="token punctuation">.</span>pyplot <span class="token keyword">as</span> plt<span class="token comment">#Note cv2 read BGR as default</span>plt<span class="token punctuation">.</span>imshow<span class="token punctuation">(</span>image<span class="token punctuation">)</span>Nếu code như trên thì ảnh đầu ra sẽ như sau:
Bởi vì cv2 mặc định đọc ảnh màu theo thứ là BGR (là blue, green và red). VÌ vậy muốn display đúng ta phài viết:
123<span class="token comment">#display rgb image</span>plt<span class="token punctuation">.</span>imshow<span class="token punctuation">(</span>image<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">,</span><span class="token punctuation">:</span><span class="token punctuation">,</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
Accessing image data with numpy.array
Các phép toán ta quen thuộc sử dụng trên numpy cũng được sử dụng trong image data.
ví dụ:
1 2 3 | img<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token comment">#output: array([128, 138, 225], dtype=uint8)</span> |
Crop ra 1 phần trong ảnh và display chúng:
1 2 3 4 | <span class="token comment">#crop image</span> crop <span class="token operator">=</span> img<span class="token punctuation">[</span><span class="token number">100</span><span class="token punctuation">:</span><span class="token number">300</span><span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">:</span><span class="token number">300</span><span class="token punctuation">]</span> plt<span class="token punctuation">.</span>imshow<span class="token punctuation">(</span>crop<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">,</span><span class="token punctuation">:</span><span class="token punctuation">,</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> |
Kết quả:
Chuyển màu vùng ta vừa crop thành màu xanh:
1 2 3 4 | copy = img.copy() copy[100:300, 100:300] = [255, 0, 0] #assign blue color plt.imshow(copy[:,:,::-1]) |
Kết quả:
Resizing images
Ta muốn resize lại ảnh trên thành ảnh có kích thước 200, 200 sẽ làm như sau:
1 2 3 4 | h<span class="token punctuation">,</span> w <span class="token operator">=</span> image<span class="token punctuation">.</span>shape<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token number">2</span><span class="token punctuation">]</span> resized <span class="token operator">=</span> cv2<span class="token punctuation">.</span>resize<span class="token punctuation">(</span>image<span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token number">200</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">)</span><span class="token punctuation">)</span> plt<span class="token punctuation">.</span>imshow<span class="token punctuation">(</span>resized<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">,</span><span class="token punctuation">:</span><span class="token punctuation">,</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> |
Write images
Lưu file ảnh ta dùng câu lệnh sau:
1 2 3 | <span class="token comment"># cv2.imwrite(filename, image)</span> cv2<span class="token punctuation">.</span>imwrite<span class="token punctuation">(</span><span class="token string">"test.jpg"</span><span class="token punctuation">,</span> resized<span class="token punctuation">)</span> |
Tổng kết
Tất cả code bạn có thể xem chi tiết tại đây: đây
Trên đây mình đã giới thiệu với các bạn về cách đọc, display và lưu một file ảnh