Python hình ảnh trung bình opencv

Chương này giới thiệu về xử lý và xử lý ảnh. Với các ví dụ phong phú, nó giải thích các gói Python trung tâm mà bạn sẽ cần để làm việc với hình ảnh. Chương này giới thiệu các công cụ cơ bản để đọc ảnh, chuyển đổi và chia tỷ lệ ảnh, tính toán đạo hàm, vẽ đồ thị hoặc lưu kết quả, v.v. Chúng tôi sẽ sử dụng chúng trong suốt phần còn lại của cuốn sách

Thư viện hình ảnh Python [PIL] cung cấp khả năng xử lý hình ảnh chung và nhiều thao tác hình ảnh cơ bản hữu ích như thay đổi kích thước, cắt xén, xoay, chuyển đổi màu sắc, v.v. PIL miễn phí và có sẵn từ http. //www. phần mềm trăn. com/products/pil/

Với PIL, bạn có thể đọc hình ảnh từ hầu hết các định dạng và ghi vào những định dạng phổ biến nhất. Mô-đun quan trọng nhất là mô-đun

box = [100,100,400,400]
region = pil_im.crop[box]
2. Để đọc một hình ảnh, sử dụng

from PIL import Image

pil_im = Image.open['empire.jpg']

Giá trị trả về, pil_im, là một đối tượng hình ảnh PIL

Chuyển đổi màu được thực hiện bằng phương pháp

box = [100,100,400,400]
region = pil_im.crop[box]
3. Để đọc một hình ảnh và chuyển đổi nó thành thang độ xám, chỉ cần thêm
box = [100,100,400,400]
region = pil_im.crop[box]
4 như thế này

pil_im = Image.open['empire.jpg'].convert['L']

Dưới đây là một số ví dụ được lấy từ tài liệu PIL, có sẵn tại http. //www. phần mềm trăn. com/library/pil/handbook/index. htm. Kết quả từ các ví dụ được hiển thị trong Hình 1-1

Chuyển đổi hình ảnh sang định dạng khác

Sử dụng phương pháp

box = [100,100,400,400]
region = pil_im.crop[box]
5, PIL có thể lưu hình ảnh ở hầu hết các định dạng tệp hình ảnh. Đây là một ví dụ lấy tất cả các tệp hình ảnh trong danh sách tên tệp [filelist] và chuyển đổi hình ảnh thành tệp JPEG

Hình 1-1. Ví dụ về xử lý hình ảnh với PIL

from PIL import Image
import os

for infile in filelist:
  outfile = os.path.splitext[infile][0] + ".jpg"
  if infile != outfile:
    try:
      Image.open[infile].save[outfile]
    except IOError:
      print "cannot convert", infile

Hàm PIL

box = [100,100,400,400]
region = pil_im.crop[box]
6 tạo một đối tượng hình ảnh PIL và phương thức
box = [100,100,400,400]
region = pil_im.crop[box]
5 lưu hình ảnh vào một tệp có tên tệp đã cho. Tên tệp mới sẽ giống với tên gốc với đuôi tệp là “. jpg” thay vào đó. PIL đủ thông minh để xác định định dạng hình ảnh từ phần mở rộng tệp. Có một kiểm tra đơn giản rằng tệp chưa phải là tệp JPEG và một thông báo sẽ được in ra bảng điều khiển nếu quá trình chuyển đổi không thành công

Xuyên suốt cuốn sách này, chúng ta sẽ cần các danh sách hình ảnh để xử lý. Đây là cách bạn có thể tạo danh sách tên tệp của tất cả các hình ảnh trong một thư mục. Tạo một tệp có tên là imtools. py để lưu trữ một số thói quen thường hữu ích này và thêm chức năng sau

import os

def get_imlist[path]:
  """  Returns a list of filenames for
    all jpg images in a directory. """

  return [os.path.join[path,f] for f in os.listdir[path] if f.endswith['.jpg']]

Bây giờ, quay lại PIL

Sử dụng PIL để tạo hình thu nhỏ rất đơn giản. Phương thức

box = [100,100,400,400]
region = pil_im.crop[box]
8 lấy một bộ dữ liệu chỉ định kích thước mới và chuyển đổi hình ảnh thành hình ảnh thu nhỏ với kích thước phù hợp với bộ dữ liệu. Để tạo hình thu nhỏ có cạnh dài nhất 128 pixel, hãy sử dụng phương pháp như thế này

from PIL import Image

pil_im = Image.open['empire.jpg']
1

Cắt xén một vùng từ một hình ảnh được thực hiện bằng phương pháp

box = [100,100,400,400]
region = pil_im.crop[box]
9

box = [100,100,400,400]
region = pil_im.crop[box]

Vùng được xác định bởi 4-tuple, trong đó tọa độ là [trái, trên, phải, dưới]. PIL sử dụng hệ tọa độ với [0, 0] ở góc trên bên trái. Ví dụ, vùng được trích xuất có thể được xoay và sau đó đặt lại bằng cách sử dụng phương pháp

from PIL import Image

pil_im = Image.open['empire.jpg']
40 như thế này

from PIL import Image

pil_im = Image.open['empire.jpg']
4

Để thay đổi kích thước hình ảnh, hãy gọi

from PIL import Image

pil_im = Image.open['empire.jpg']
41 với một bộ cung cấp kích thước mới

from PIL import Image

pil_im = Image.open['empire.jpg']
7

Để xoay hình ảnh, hãy sử dụng các góc ngược chiều kim đồng hồ và

from PIL import Image

pil_im = Image.open['empire.jpg']
42 như thế này

from PIL import Image

pil_im = Image.open['empire.jpg']
9

Một số ví dụ được hiển thị trong Hình 1-1. Hình ảnh ngoài cùng bên trái là hình gốc, theo sau là phiên bản thang độ xám, hình cắt xoay được dán vào và hình thu nhỏ

Khi làm việc với toán học và vẽ biểu đồ hoặc vẽ các điểm, đường thẳng và đường cong trên hình ảnh,

from PIL import Image

pil_im = Image.open['empire.jpg']
43 là một thư viện đồ họa tốt với các tính năng mạnh mẽ hơn nhiều so với vẽ đồ thị có sẵn trong PIL.
from PIL import Image

pil_im = Image.open['empire.jpg']
43 tạo ra các số liệu chất lượng cao giống như nhiều hình minh họa được sử dụng trong cuốn sách này. Giao diện
from PIL import Image

pil_im = Image.open['empire.jpg']
46 của
from PIL import Image

pil_im = Image.open['empire.jpg']
43 là tập hợp các chức năng cho phép người dùng tạo biểu đồ.
from PIL import Image

pil_im = Image.open['empire.jpg']
43 là mã nguồn mở và có sẵn miễn phí từ http. // matplotlib. nguồn. net/, nơi có tài liệu và hướng dẫn chi tiết. Dưới đây là một số ví dụ hiển thị hầu hết các chức năng chúng ta sẽ cần trong cuốn sách này

Vẽ đồ thị hình ảnh, điểm và đường

Mặc dù có thể tạo các biểu đồ thanh đẹp, biểu đồ hình tròn, biểu đồ phân tán, v.v. , chỉ cần một vài lệnh cho hầu hết các mục đích thị giác máy tính. Quan trọng nhất, chúng tôi muốn có thể hiển thị những thứ như điểm quan tâm, sự tương ứng và các đối tượng được phát hiện bằng cách sử dụng các điểm và đường. Dưới đây là một ví dụ về vẽ một hình ảnh với một vài điểm và một đường

box = [100,100,400,400]
region = pil_im.crop[box]
5

Thao tác này vẽ sơ đồ hình ảnh, sau đó vẽ bốn điểm có đánh dấu sao màu đỏ ở tọa độ x và y được cung cấp bởi danh sách x và y, và cuối cùng vẽ một đường thẳng [theo mặc định là màu xanh lam] giữa hai điểm đầu tiên trong các danh sách này. Hình 1-2 hiển thị kết quả. Lệnh

from PIL import Image

pil_im = Image.open['empire.jpg']
48 khởi động GUI hình và mở các cửa sổ hình. Vòng lặp GUI này chặn tập lệnh của bạn và chúng bị tạm dừng cho đến khi đóng cửa sổ hình cuối cùng. Bạn chỉ nên gọi
from PIL import Image

pil_im = Image.open['empire.jpg']
48 một lần cho mỗi tập lệnh, thường là ở cuối. Lưu ý rằng
from PIL import Image

pil_im = Image.open['empire.jpg']
46 sử dụng gốc tọa độ ở góc trên cùng bên trái như thông thường đối với hình ảnh. Các trục rất hữu ích để gỡ lỗi, nhưng nếu bạn muốn một biểu đồ đẹp hơn, hãy thêm

pil_im = Image.open['empire.jpg'].convert['L']
0

Thay vào đó, thao tác này sẽ đưa ra một biểu đồ giống như biểu đồ bên phải trong Hình 1-2

Có nhiều tùy chọn để định dạng màu và kiểu khi vẽ. Hữu ích nhất là các lệnh ngắn được hiển thị trong Bảng 1-1, Bảng 1-2 và Bảng 1-3. Sử dụng chúng như thế này

pil_im = Image.open['empire.jpg'].convert['L']
1

Đường viền và biểu đồ hình ảnh

Hãy xem xét hai ví dụ về các ô đặc biệt. đường viền hình ảnh và biểu đồ hình ảnh. Trực quan hóa các đường đồng mức của hình ảnh [hoặc các đường đồng mức của các chức năng 2D khác] có thể rất hữu ích. Điều này cần các hình ảnh thang độ xám, vì các đường viền cần được lấy trên một giá trị duy nhất cho mọi tọa độ [x, y]. Đây là cách thực hiện

Hình 1-2. Ví dụ về vẽ đồ thị với

from PIL import Image

pil_im = Image.open['empire.jpg']
43. Một hình ảnh có các điểm và một đường có và không hiển thị các trục

Bảng 1-1. Các lệnh định dạng màu cơ bản để vẽ đồ thị với

from PIL import Image

pil_im = Image.open['empire.jpg']
46

Màu

from PIL import Image

pil_im = Image.open['empire.jpg']
73

màu xanh da trời

from PIL import Image

pil_im = Image.open['empire.jpg']
74

màu xanh lá

from PIL import Image

pil_im = Image.open['empire.jpg']
75

màu đỏ

from PIL import Image

pil_im = Image.open['empire.jpg']
76

lục lam

from PIL import Image

pil_im = Image.open['empire.jpg']
77

đỏ tươi

from PIL import Image

pil_im = Image.open['empire.jpg']
78

màu vàng

from PIL import Image

pil_im = Image.open['empire.jpg']
79

đen

from PIL import Image

pil_im = Image.open['empire.jpg']
90

trắng

Bảng 1-2. Các lệnh định dạng kiểu đường cơ bản để vẽ đồ thị với

from PIL import Image

pil_im = Image.open['empire.jpg']
46

kiểu đường kẻ

from PIL import Image

pil_im = Image.open['empire.jpg']
92

chất rắn

from PIL import Image

pil_im = Image.open['empire.jpg']
93

tiêu tan

from PIL import Image

pil_im = Image.open['empire.jpg']
94

say mê

Bảng 1-3. Các lệnh định dạng điểm đánh dấu cốt truyện cơ bản để vẽ đồ thị với

from PIL import Image

pil_im = Image.open['empire.jpg']
46

Đánh dấu

from PIL import Image

pil_im = Image.open['empire.jpg']
96

điểm

from PIL import Image

pil_im = Image.open['empire.jpg']
97

khoanh tròn

from PIL import Image

pil_im = Image.open['empire.jpg']
98

Quảng trường

from PIL import Image

pil_im = Image.open['empire.jpg']
99

ngôi sao

box = [100,100,400,400]
region = pil_im.crop[box]
50

thêm

box = [100,100,400,400]
region = pil_im.crop[box]
51

x

pil_im = Image.open['empire.jpg'].convert['L']
2

Như trước đây, phương thức PIL

box = [100,100,400,400]
region = pil_im.crop[box]
3 thực hiện chuyển đổi sang thang độ xám

Biểu đồ hình ảnh là biểu đồ hiển thị phân phối giá trị pixel. Một số ngăn được chỉ định cho khoảng giá trị và mỗi ngăn sẽ đếm được có bao nhiêu pixel có giá trị trong phạm vi của ngăn. Việc trực quan hóa biểu đồ hình ảnh [mức xám] được thực hiện bằng cách sử dụng chức năng

box = [100,100,400,400]
region = pil_im.crop[box]
53

pil_im = Image.open['empire.jpg'].convert['L']
3

Đối số thứ hai chỉ định số lượng thùng sẽ sử dụng. Lưu ý rằng hình ảnh cần được làm phẳng trước, vì

box = [100,100,400,400]
region = pil_im.crop[box]
53 lấy mảng một chiều làm đầu vào. Phương thức
box = [100,100,400,400]
region = pil_im.crop[box]
55 chuyển đổi bất kỳ mảng nào thành mảng một chiều với các giá trị được lấy theo hàng. Hình 1-3 hiển thị biểu đồ đường viền và biểu đồ

Hình 1-3. Ví dụ về trực quan hóa đường viền hình ảnh và vẽ biểu đồ hình ảnh với

from PIL import Image

pil_im = Image.open['empire.jpg']
43

Đôi khi người dùng cần tương tác với một ứng dụng, chẳng hạn bằng cách đánh dấu các điểm trong một hình ảnh hoặc bạn cần chú thích một số dữ liệu đào tạo.

from PIL import Image

pil_im = Image.open['empire.jpg']
46 đi kèm với một chức năng đơn giản,
box = [100,100,400,400]
region = pil_im.crop[box]
58, cho phép bạn làm điều đó. Đây là một ví dụ ngắn

pil_im = Image.open['empire.jpg'].convert['L']
4

Thao tác này vẽ một hình ảnh và đợi người dùng nhấp ba lần vào vùng hình ảnh của cửa sổ hình. Các tọa độ [x, y] của các lần nhấp được lưu trong danh sách x

box = [100,100,400,400]
region = pil_im.crop[box]
59 [http. //www. scipy. org/NumPy/] là gói được sử dụng phổ biến cho tính toán khoa học với Python.
box = [100,100,400,400]
region = pil_im.crop[box]
59 chứa một số khái niệm hữu ích như đối tượng mảng [để biểu diễn vectơ, ma trận, hình ảnh, v.v.] và các hàm đại số tuyến tính. Đối tượng mảng
box = [100,100,400,400]
region = pil_im.crop[box]
59 sẽ được sử dụng trong hầu hết các ví dụ xuyên suốt cuốn sách này. [] Đối tượng mảng cho phép bạn thực hiện các thao tác quan trọng như nhân ma trận, chuyển vị, giải hệ phương trình, nhân vectơ và chuẩn hóa, cần thiết để thực hiện những việc như căn chỉnh hình ảnh, làm cong hình ảnh, biến thể mô hình hóa, phân loại hình ảnh, nhóm hình ảnh và

box = [100,100,400,400]
region = pil_im.crop[box]
59 có sẵn miễn phí từ http. //www. scipy. org/Download và tài liệu trực tuyến [http. // tài liệu. scipy. org/doc/numpy/] chứa câu trả lời cho hầu hết các câu hỏi. Để biết thêm chi tiết về
box = [100,100,400,400]
region = pil_im.crop[box]
59, cuốn sách có sẵn miễn phí [24] là một tài liệu tham khảo tốt

Biểu diễn hình ảnh mảng

Khi chúng tôi tải hình ảnh trong các ví dụ trước, chúng tôi đã chuyển đổi chúng thành đối tượng mảng

box = [100,100,400,400]
region = pil_im.crop[box]
59 bằng lệnh gọi
pil_im = Image.open['empire.jpg'].convert['L']
05 nhưng không đề cập đến điều đó có nghĩa là gì. Mảng trong
box = [100,100,400,400]
region = pil_im.crop[box]
59 là đa chiều và có thể biểu diễn vectơ, ma trận và hình ảnh. Một mảng giống như một danh sách [hoặc danh sách các danh sách] nhưng bị hạn chế là có tất cả các phần tử cùng loại. Trừ khi được chỉ định khi tạo, loại sẽ tự động được đặt tùy thuộc vào dữ liệu

Ví dụ sau minh họa điều này cho hình ảnh

pil_im = Image.open['empire.jpg'].convert['L']
5

Bản in trong bảng điều khiển của bạn sẽ trông như thế này

pil_im = Image.open['empire.jpg'].convert['L']
6

Tuple đầu tiên trên mỗi dòng là hình dạng của mảng hình ảnh [hàng, cột, kênh màu] và chuỗi tiếp theo là kiểu dữ liệu của các phần tử mảng. Hình ảnh thường được mã hóa bằng số nguyên 8 bit không dấu [uint8], vì vậy việc tải hình ảnh này và chuyển đổi thành một mảng sẽ cho loại “uint8” trong trường hợp đầu tiên. Trường hợp thứ hai thực hiện chuyển đổi thang độ xám và tạo mảng có thêm đối số “f”. Đây là một lệnh ngắn để đặt loại thành dấu phẩy động. Để biết thêm tùy chọn loại dữ liệu, hãy xem [24]. Lưu ý rằng hình ảnh thang độ xám chỉ có hai giá trị trong bộ hình dạng;

Các phần tử trong mảng được truy cập bằng chỉ số. Giá trị tại tọa độ i, j và kênh màu k được truy cập như thế này

pil_im = Image.open['empire.jpg'].convert['L']
7

Nhiều phần tử có thể được truy cập bằng cách sử dụng mảng cắt. Cắt lát trả về một dạng xem vào mảng được chỉ định bởi các khoảng thời gian. Dưới đây là một số ví dụ cho một hình ảnh thang độ xám

pil_im = Image.open['empire.jpg'].convert['L']
8

Lưu ý ví dụ chỉ có một chỉ mục. Nếu bạn chỉ sử dụng một chỉ mục thì nó được hiểu là chỉ mục hàng. Cũng lưu ý các ví dụ cuối cùng. Chỉ số âm được tính từ phần tử cuối cùng trở về sau. Chúng tôi sẽ thường xuyên sử dụng cắt lát để truy cập các giá trị pixel và đây là một khái niệm quan trọng cần hiểu

Có nhiều thao tác và cách sử dụng mảng. Chúng tôi sẽ giới thiệu chúng khi cần thiết trong suốt cuốn sách này. Xem tài liệu trực tuyến hoặc sách [24] để được giải thích thêm

Sau khi đọc hình ảnh vào mảng

box = [100,100,400,400]
region = pil_im.crop[box]
59, chúng ta có thể thực hiện bất kỳ phép toán nào chúng ta muốn trên chúng. Một ví dụ đơn giản về điều này là biến đổi mức độ xám của ảnh. Lấy bất kỳ hàm f nào ánh xạ khoảng 0. . . 255 [hoặc, nếu bạn thích, 0. . . 1] cho chính nó [có nghĩa là đầu ra có cùng phạm vi với đầu vào]. Dưới đây là một số ví dụ

pil_im = Image.open['empire.jpg'].convert['L']
9

Ví dụ đầu tiên đảo ngược mức độ xám của hình ảnh, ví dụ thứ hai kẹp cường độ vào khoảng 100. . . 200 và cái thứ ba áp dụng hàm bậc hai, làm giảm giá trị của các pixel tối hơn. Hình 1-4 hiển thị các chức năng và Hình 1-5 hình ảnh kết quả. Bạn có thể kiểm tra giá trị tối thiểu và tối đa của mỗi hình ảnh bằng cách sử dụng

from PIL import Image
import os

for infile in filelist:
  outfile = os.path.splitext[infile][0] + ".jpg"
  if infile != outfile:
    try:
      Image.open[infile].save[outfile]
    except IOError:
      print "cannot convert", infile
0

Hình 1-4. Ví dụ về biến đổi mức xám. Ba hàm ví dụ cùng với biến đổi nhận dạng được hiển thị dưới dạng đường đứt nét

Hình 1-5. biến đổi mức xám. Áp dụng các chức năng trong Hình 1-4. Đảo ảnh với f[x] = 255 – x [trái], kẹp ảnh với f[x] = [100/255]x + 100 [giữa], biến đổi bậc hai với f[x] = 255[x/255]

Nếu bạn thử điều đó cho từng ví dụ trên, bạn sẽ nhận được kết quả sau

from PIL import Image
import os

for infile in filelist:
  outfile = os.path.splitext[infile][0] + ".jpg"
  if infile != outfile:
    try:
      Image.open[infile].save[outfile]
    except IOError:
      print "cannot convert", infile
1

Việc đảo ngược phép biến đổi

pil_im = Image.open['empire.jpg'].convert['L']
05 có thể được thực hiện bằng cách sử dụng hàm PIL
pil_im = Image.open['empire.jpg'].convert['L']
09 như

from PIL import Image
import os

for infile in filelist:
  outfile = os.path.splitext[infile][0] + ".jpg"
  if infile != outfile:
    try:
      Image.open[infile].save[outfile]
    except IOError:
      print "cannot convert", infile
2

Nếu bạn đã thực hiện một số thao tác để thay đổi loại từ “uint8” sang loại dữ liệu khác, chẳng hạn như im3 hoặc im4 trong ví dụ trên, bạn cần chuyển đổi ngược lại trước khi tạo ảnh PIL

from PIL import Image
import os

for infile in filelist:
  outfile = os.path.splitext[infile][0] + ".jpg"
  if infile != outfile:
    try:
      Image.open[infile].save[outfile]
    except IOError:
      print "cannot convert", infile
3

Nếu bạn không hoàn toàn chắc chắn về loại đầu vào, bạn nên làm điều này vì đây là lựa chọn an toàn. Lưu ý rằng

box = [100,100,400,400]
region = pil_im.crop[box]
59 sẽ luôn thay đổi kiểu mảng thành kiểu “thấp nhất” để có thể biểu diễn dữ liệu. Phép nhân hoặc phép chia với các số dấu phẩy động sẽ thay đổi một mảng kiểu số nguyên thành dấu phẩy động

Mảng

box = [100,100,400,400]
region = pil_im.crop[box]
59 sẽ là công cụ chính của chúng tôi để làm việc với hình ảnh và dữ liệu. Không có cách đơn giản nào để thay đổi kích thước mảng mà bạn sẽ muốn thực hiện đối với hình ảnh. Chúng ta có thể sử dụng chuyển đổi đối tượng hình ảnh PIL được hiển thị trước đó để thực hiện chức năng thay đổi kích thước hình ảnh đơn giản. Thêm phần sau vào imtools. py

from PIL import Image
import os

for infile in filelist:
  outfile = os.path.splitext[infile][0] + ".jpg"
  if infile != outfile:
    try:
      Image.open[infile].save[outfile]
    except IOError:
      print "cannot convert", infile
4

Chức năng này sẽ có ích sau này

Một ví dụ rất hữu ích về biến đổi mức xám là cân bằng biểu đồ. Phép biến đổi này làm phẳng biểu đồ mức xám của ảnh sao cho tất cả các cường độ đều phổ biến như nhau nhất có thể. Đây thường là một cách tốt để chuẩn hóa cường độ hình ảnh trước khi xử lý thêm và cũng là một cách để tăng độ tương phản của hình ảnh

Trong trường hợp này, hàm biến đổi là hàm phân phối tích lũy [cdf] của các giá trị pixel trong ảnh [được chuẩn hóa để ánh xạ dải giá trị pixel thành dải mong muốn]

Đây là cách thực hiện. Thêm chức năng này vào tệp imtools. py

from PIL import Image
import os

for infile in filelist:
  outfile = os.path.splitext[infile][0] + ".jpg"
  if infile != outfile:
    try:
      Image.open[infile].save[outfile]
    except IOError:
      print "cannot convert", infile
5

Hàm lấy một hình ảnh thang độ xám và số lượng thùng sẽ sử dụng trong biểu đồ làm đầu vào và trả về một hình ảnh có biểu đồ tần số được cân bằng cùng với hàm phân phối tích lũy được sử dụng để thực hiện ánh xạ các giá trị pixel. Lưu ý việc sử dụng phần tử cuối cùng [chỉ số -1] của cdf để chuẩn hóa nó trong khoảng từ 0. 1. Hãy thử điều này trên một hình ảnh như thế này

from PIL import Image
import os

for infile in filelist:
  outfile = os.path.splitext[infile][0] + ".jpg"
  if infile != outfile:
    try:
      Image.open[infile].save[outfile]
    except IOError:
      print "cannot convert", infile
6

Hình 1-6 và Hình 1-7 minh họa các ví dụ về cân bằng biểu đồ. Hàng trên cùng hiển thị biểu đồ mức xám trước và sau khi cân bằng cùng với ánh xạ cdf. Như bạn có thể thấy, độ tương phản tăng lên và các chi tiết của vùng tối hiện rõ ràng

Lấy trung bình hình ảnh là một cách đơn giản để giảm nhiễu hình ảnh và cũng thường được sử dụng cho các hiệu ứng nghệ thuật. Tính toán một hình ảnh trung bình từ một danh sách các hình ảnh không khó. Giả sử tất cả các hình ảnh đều có cùng kích thước, chúng ta có thể tính trung bình của tất cả các hình ảnh đó bằng cách cộng chúng lại và chia cho số lượng hình ảnh. Thêm chức năng sau vào imtools. py

from PIL import Image
import os

for infile in filelist:
  outfile = os.path.splitext[infile][0] + ".jpg"
  if infile != outfile:
    try:
      Image.open[infile].save[outfile]
    except IOError:
      print "cannot convert", infile
7

Điều này bao gồm một số xử lý ngoại lệ cơ bản để bỏ qua những hình ảnh không thể mở được. Có một cách khác để tính trung bình hình ảnh bằng cách sử dụng hàm

pil_im = Image.open['empire.jpg'].convert['L']
12. Điều này yêu cầu tất cả các hình ảnh phải được xếp chồng lên nhau thành một mảng và sẽ sử dụng nhiều bộ nhớ nếu có nhiều hình ảnh. Chúng ta sẽ sử dụng chức năng này trong phần tiếp theo

Hình 1-6. Ví dụ về cân bằng biểu đồ. Bên trái là ảnh gốc và biểu đồ. Biểu đồ ở giữa là hàm biến đổi cấp độ xám. Bên phải là hình ảnh và biểu đồ sau khi cân bằng biểu đồ

Hình 1-7. Ví dụ về cân bằng biểu đồ. Bên trái là ảnh gốc và biểu đồ. Biểu đồ ở giữa là hàm biến đổi cấp độ xám. Bên phải là hình ảnh và biểu đồ sau khi cân bằng biểu đồ

Phân tích thành phần chính [PCA] là một kỹ thuật hữu ích để giảm kích thước và tối ưu theo nghĩa là nó thể hiện tính biến thiên của dữ liệu đào tạo với càng ít kích thước càng tốt. Ngay cả một hình ảnh thang độ xám 100 × 100 pixel nhỏ cũng có 10.000 chiều và có thể được coi là một điểm trong không gian 10.000 chiều. Một hình ảnh megapixel có kích thước hàng triệu. Với số chiều cao như vậy, không có gì ngạc nhiên khi việc giảm kích thước có ích trong nhiều ứng dụng thị giác máy tính. Ma trận chiếu kết quả từ PCA có thể được coi là sự thay đổi tọa độ thành hệ tọa độ trong đó tọa độ theo thứ tự quan trọng giảm dần

Để áp dụng PCA trên dữ liệu hình ảnh, hình ảnh cần được chuyển đổi thành biểu diễn véc tơ một chiều bằng cách sử dụng, ví dụ: phương pháp

box = [100,100,400,400]
region = pil_im.crop[box]
55 của
box = [100,100,400,400]
region = pil_im.crop[box]
59

Các hình ảnh được làm phẳng được thu thập trong một ma trận duy nhất bằng cách xếp chồng chúng, một hàng cho mỗi hình ảnh. Các hàng sau đó được căn giữa so với hình ảnh trung bình trước khi tính toán các hướng chi phối. Để tìm các thành phần chính, phân tách giá trị số ít [SVD] thường được sử dụng, nhưng nếu số chiều cao, có một thủ thuật hữu ích có thể được sử dụng thay vì tính toán SVD sẽ rất chậm trong trường hợp đó. Đây là những gì nó trông giống như trong mã

from PIL import Image
import os

for infile in filelist:
  outfile = os.path.splitext[infile][0] + ".jpg"
  if infile != outfile:
    try:
      Image.open[infile].save[outfile]
    except IOError:
      print "cannot convert", infile
8

Trước tiên, hàm này căn giữa dữ liệu bằng cách trừ đi giá trị trung bình trong mỗi thứ nguyên. Sau đó, các vectơ riêng tương ứng với các giá trị riêng lớn nhất của ma trận hiệp phương sai được tính toán, bằng cách sử dụng thủ thuật nhỏ gọn hoặc sử dụng SVD. Ở đây chúng tôi đã sử dụng hàm

pil_im = Image.open['empire.jpg'].convert['L']
15, nhận vào một số nguyên n và trả về một danh sách các số nguyên 0. . . [n – 1]. Vui lòng sử dụng thay thế
pil_im = Image.open['empire.jpg'].convert['L']
16, cung cấp một mảng hoặc
pil_im = Image.open['empire.jpg'].convert['L']
17, cung cấp trình tạo [và có thể cải thiện tốc độ]. Chúng tôi sẽ gắn bó với
pil_im = Image.open['empire.jpg'].convert['L']
15 trong suốt cuốn sách

Chúng tôi chuyển từ SVD sang sử dụng thủ thuật tính toán các vectơ riêng của ma trận hiệp phương sai [nhỏ hơn] XXT nếu số điểm dữ liệu nhỏ hơn kích thước của vectơ. Ngoài ra còn có các cách chỉ tính toán các hàm riêng tương ứng với k giá trị riêng lớn nhất [k là số thứ nguyên mong muốn], làm cho nó thậm chí còn nhanh hơn. Chúng tôi để điều này cho độc giả quan tâm khám phá, vì nó thực sự nằm ngoài phạm vi của cuốn sách này. Các hàng của ma trận V là trực giao và chứa các hướng tọa độ theo thứ tự phương sai giảm dần của dữ liệu huấn luyện

Hãy thử điều này trên một ví dụ về hình ảnh phông chữ. Các tập tin phông chữ hình ảnh. zip chứa các hình thu nhỏ nhỏ của ký tự “a” được in bằng các phông chữ khác nhau và sau đó được quét. 2.359 phông chữ là từ một bộ sưu tập các phông chữ có sẵn miễn phí. [] Giả sử rằng tên tệp của những hình ảnh này được lưu trữ trong danh sách, imlist, cùng với mã trước đó, trong tệp pca. py, các thành phần chính có thể được tính toán và hiển thị như thế này

from PIL import Image
import os

for infile in filelist:
  outfile = os.path.splitext[infile][0] + ".jpg"
  if infile != outfile:
    try:
      Image.open[infile].save[outfile]
    except IOError:
      print "cannot convert", infile
9

Hình 1-8. Hình ảnh trung bình [trên cùng bên trái] và bảy chế độ đầu tiên;

Lưu ý rằng các hình ảnh cần được chuyển đổi trở lại từ biểu diễn một chiều bằng cách sử dụng

pil_im = Image.open['empire.jpg'].convert['L']
19. Chạy ví dụ sẽ cho tám hình ảnh trong cửa sổ một hình giống như trong Hình 1-8. Ở đây, chúng tôi đã sử dụng hàm
from PIL import Image

pil_im = Image.open['empire.jpg']
46
pil_im = Image.open['empire.jpg'].convert['L']
21 để đặt nhiều ô trong một cửa sổ

Nếu bạn muốn lưu một số kết quả hoặc dữ liệu để sử dụng sau này, mô-đun

pil_im = Image.open['empire.jpg'].convert['L']
22, đi kèm với Python, rất hữu ích. Pickle có thể lấy hầu hết mọi đối tượng Python và chuyển đổi nó thành biểu diễn chuỗi. Quá trình này được gọi là ngâm. Việc xây dựng lại đối tượng từ biểu diễn chuỗi ngược lại được gọi là unpickling. Biểu diễn chuỗi này sau đó có thể dễ dàng được lưu trữ hoặc truyền đi

Hãy minh họa điều này với một ví dụ. Giả sử chúng ta muốn lưu ý nghĩa hình ảnh và các thành phần chính của phông hình ảnh ở phần trước. Điều này được thực hiện như thế này

import os

def get_imlist[path]:
  """  Returns a list of filenames for
    all jpg images in a directory. """

  return [os.path.join[path,f] for f in os.listdir[path] if f.endswith['.jpg']]
0

Như bạn có thể thấy, một số đối tượng có thể được chọn vào cùng một tệp. Có một số giao thức khác nhau có sẵn cho. pkl và nếu không chắc chắn, tốt nhất là đọc và ghi các tệp nhị phân. Để tải dữ liệu trong một số phiên Python khác, chỉ cần sử dụng phương thức

pil_im = Image.open['empire.jpg'].convert['L']
23 như thế này

import os

def get_imlist[path]:
  """  Returns a list of filenames for
    all jpg images in a directory. """

  return [os.path.join[path,f] for f in os.listdir[path] if f.endswith['.jpg']]
1

Lưu ý rằng thứ tự của các đối tượng phải giống nhau. Ngoài ra còn có một phiên bản được tối ưu hóa được viết bằng C có tên là

pil_im = Image.open['empire.jpg'].convert['L']
24 hoàn toàn tương thích với mô-đun dưa chua tiêu chuẩn. Thông tin chi tiết có thể được tìm thấy trên trang tài liệu mô-đun pickle http. // tài liệu. con trăn. org/thư viện/dưa chua. html

Trong phần còn lại của cuốn sách này, chúng ta sẽ sử dụng câu lệnh

pil_im = Image.open['empire.jpg'].convert['L']
25 để xử lý việc đọc và ghi tệp. Đây là một cấu trúc đã được giới thiệu trong Python 2. 5 tự động xử lý mở và đóng tệp [ngay cả khi xảy ra lỗi khi tệp đang mở]. Đây là cách lưu và tải ở trên trông như thế nào khi sử dụng
pil_im = Image.open['empire.jpg'].convert['L']
26

import os

def get_imlist[path]:
  """  Returns a list of filenames for
    all jpg images in a directory. """

  return [os.path.join[path,f] for f in os.listdir[path] if f.endswith['.jpg']]
2

import os

def get_imlist[path]:
  """  Returns a list of filenames for
    all jpg images in a directory. """

  return [os.path.join[path,f] for f in os.listdir[path] if f.endswith['.jpg']]
3

Điều này có thể trông kỳ lạ khi bạn nhìn thấy nó lần đầu tiên, nhưng nó là một cấu trúc rất hữu ích. Nếu không thích thì cứ dùng hàm

pil_im = Image.open['empire.jpg'].convert['L']
27 và
pil_im = Image.open['empire.jpg'].convert['L']
28 như trên

Là một giải pháp thay thế cho việc sử dụng pickle,

box = [100,100,400,400]
region = pil_im.crop[box]
59 cũng có các chức năng đơn giản để đọc và ghi tệp văn bản có thể hữu ích nếu dữ liệu của bạn không chứa các cấu trúc phức tạp, ví dụ: danh sách các điểm được nhấp vào trong một hình ảnh. Để lưu một mảng x vào tệp, hãy sử dụng

import os

def get_imlist[path]:
  """  Returns a list of filenames for
    all jpg images in a directory. """

  return [os.path.join[path,f] for f in os.listdir[path] if f.endswith['.jpg']]
4

Tham số cuối cùng cho biết nên sử dụng định dạng số nguyên. Tương tự, đọc được thực hiện như thế này

import os

def get_imlist[path]:
  """  Returns a list of filenames for
    all jpg images in a directory. """

  return [os.path.join[path,f] for f in os.listdir[path] if f.endswith['.jpg']]
5

Bạn có thể tìm hiểu thêm từ tài liệu trực tuyến http. // tài liệu. scipy. org/doc/numpy/tham chiếu/được tạo/numpy. tảitxt. html

Cuối cùng,

box = [100,100,400,400]
region = pil_im.crop[box]
59 có chức năng chuyên dụng để lưu và tải mảng. Tìm kiếm
box = [100,100,400,400]
region = pil_im.crop[box]
5 và
pil_im = Image.open['empire.jpg'].convert['L']
23 trong tài liệu trực tuyến để biết chi tiết

pil_im = Image.open['empire.jpg'].convert['L']
33 [http. //scipy. org/] là gói nguồn mở dành cho toán học được xây dựng trên
box = [100,100,400,400]
region = pil_im.crop[box]
59 và cung cấp các quy trình hiệu quả cho một số hoạt động, bao gồm tích hợp số, tối ưu hóa, thống kê, xử lý tín hiệu và quan trọng nhất đối với chúng tôi là xử lý hình ảnh. Như sau đây sẽ cho thấy, có rất nhiều mô-đun hữu ích trong
pil_im = Image.open['empire.jpg'].convert['L']
33.
pil_im = Image.open['empire.jpg'].convert['L']
33 miễn phí và có sẵn tại http. //scipy. org/Tải xuống

Một ví dụ cổ điển và rất hữu ích về tích chập hình ảnh là làm mờ hình ảnh Gaussian. Về bản chất, hình ảnh [thang độ xám] tôi được kết hợp với hạt nhân Gaussian để tạo ra một phiên bản mờ

Iσ = Tôi * Gσ,

trong đó * biểu thị tích chập và Gσ là hạt nhân 2D Gaussian với độ lệch chuẩn σ được định nghĩa là

Làm mờ Gaussian được sử dụng để xác định tỷ lệ hình ảnh sẽ hoạt động, để nội suy, để tính toán các điểm quan tâm và trong nhiều ứng dụng khác

pil_im = Image.open['empire.jpg'].convert['L']
33 đi kèm với một mô-đun để lọc có tên là
pil_im = Image.open['empire.jpg'].convert['L']
38 có thể được sử dụng để tính toán các kết cấu này bằng cách sử dụng phân tách 1D nhanh. Tất cả những gì bạn cần làm là thế này

import os

def get_imlist[path]:
  """  Returns a list of filenames for
    all jpg images in a directory. """

  return [os.path.join[path,f] for f in os.listdir[path] if f.endswith['.jpg']]
6

Ở đây tham số cuối cùng của

pil_im = Image.open['empire.jpg'].convert['L']
39 là độ lệch chuẩn

Hình 1-9 minh họa các ví dụ về hình ảnh bị mờ khi tăng σ. Giá trị lớn hơn cho ít chi tiết hơn. Để làm mờ hình ảnh màu, chỉ cần áp dụng hiệu ứng làm mờ Gaussian cho từng kênh màu

import os

def get_imlist[path]:
  """  Returns a list of filenames for
    all jpg images in a directory. """

  return [os.path.join[path,f] for f in os.listdir[path] if f.endswith['.jpg']]
7

Ở đây, chuyển đổi cuối cùng thành “uint8” không phải lúc nào cũng cần thiết nhưng buộc các giá trị pixel phải ở dạng biểu diễn 8 bit. Chúng tôi cũng có thể đã sử dụng

import os

def get_imlist[path]:
  """  Returns a list of filenames for
    all jpg images in a directory. """

  return [os.path.join[path,f] for f in os.listdir[path] if f.endswith['.jpg']]
8

cho việc chuyển đổi

Hình 1-9. Một ví dụ về làm mờ Gaussian bằng mô-đun

pil_im = Image.open['empire.jpg'].convert['L']
38. [a] hình ảnh gốc ở thang độ xám;

Để biết thêm thông tin về cách sử dụng mô-đun này và các lựa chọn tham số khác nhau, hãy xem tài liệu về

pil_im = Image.open['empire.jpg'].convert['L']
33 của
pil_im = Image.open['empire.jpg'].convert['L']
42 tại http. // tài liệu. scipy. org/doc/scipy/tham khảo/ndimage. html

Cường độ ảnh thay đổi như thế nào trên ảnh là thông tin quan trọng và được sử dụng cho nhiều ứng dụng, như chúng ta sẽ thấy xuyên suốt cuốn sách này. Sự thay đổi cường độ được mô tả bằng các đạo hàm x và y Ix và Iy của ảnh mức xám I [đối với ảnh màu thường lấy đạo hàm cho từng kênh màu]

Độ dốc hình ảnh là vectơ ∇I = [Ix, Iy]T. Độ dốc có hai thuộc tính quan trọng, độ lớn của độ dốc

mô tả mức độ thay đổi cường độ hình ảnh mạnh như thế nào và góc độ dốc

α = arctan2[Iy, Ix],

cho biết hướng thay đổi cường độ lớn nhất tại mỗi điểm [pixel] trong ảnh. Hàm

box = [100,100,400,400]
region = pil_im.crop[box]
59
pil_im = Image.open['empire.jpg'].convert['L']
44 trả về góc có dấu theo đơn vị radian, trong khoảng –π. π

Việc tính toán các dẫn xuất hình ảnh có thể được thực hiện bằng cách sử dụng các xấp xỉ rời rạc. Chúng được thực hiện dễ dàng nhất dưới dạng tích chập

Ix = I * Dx và Iy = I * Dy

Hai lựa chọn phổ biến cho Dx và Dy là bộ lọc Prewitt

và bộ lọc Sobel

Các bộ lọc phái sinh này rất dễ thực hiện bằng cách sử dụng tích chập tiêu chuẩn có sẵn trong mô-đun

pil_im = Image.open['empire.jpg'].convert['L']
38. Ví dụ

import os

def get_imlist[path]:
  """  Returns a list of filenames for
    all jpg images in a directory. """

  return [os.path.join[path,f] for f in os.listdir[path] if f.endswith['.jpg']]
9

Điều này tính toán đạo hàm x và y và cường độ gradient bằng cách sử dụng bộ lọc Sobel. Đối số thứ hai chọn đạo hàm x hoặc y và đối số thứ ba lưu đầu ra. Hình 1-10 hiển thị một hình ảnh có đạo hàm được tính toán bằng bộ lọc Sobel. Trong hai hình ảnh đạo hàm, đạo hàm dương được hiển thị bằng các pixel sáng và đạo hàm âm có màu tối. Các vùng màu xám có giá trị gần bằng không

Sử dụng phương pháp này có nhược điểm là đạo hàm được thực hiện trên thang đo được xác định bởi độ phân giải hình ảnh. Để mạnh mẽ hơn đối với nhiễu hình ảnh và tính toán đạo hàm ở bất kỳ tỷ lệ nào, có thể sử dụng bộ lọc đạo hàm Gaussian

Ix = I * Gσx và Iy = I * Gσy,

trong đó Gσx và Gσy là đạo hàm x và y của Gσ, một hàm Gauss với độ lệch chuẩn σ

Thay vào đó, hàm

pil_im = Image.open['empire.jpg'].convert['L']
46 mà chúng ta đã sử dụng để làm mờ trước đó cũng có thể nhận thêm các đối số để tính toán các đạo hàm Gaussian. Để thử điều này trên một hình ảnh, chỉ cần làm

from PIL import Image

pil_im = Image.open['empire.jpg']
10

Đối số thứ ba chỉ định thứ tự của các công cụ phái sinh sẽ sử dụng theo mỗi hướng bằng cách sử dụng độ lệch chuẩn được xác định bởi đối số thứ hai. Xem tài liệu để biết chi tiết. Hình 1-11 hiển thị đạo hàm và độ dốc cho các tỷ lệ khác nhau. So sánh điều này với hiện tượng mờ ở cùng tỷ lệ trong Hình 1-9

Hình 1-10. Một ví dụ về tính toán dẫn xuất hình ảnh bằng cách sử dụng bộ lọc dẫn xuất Sobel. [a] hình ảnh gốc ở thang độ xám;

Hình 1-11. Một ví dụ về tính toán các dẫn xuất hình ảnh bằng cách sử dụng các dẫn xuất Gaussian. đạo hàm x [trên cùng], đạo hàm y [ở giữa] và cường độ gradient [dưới cùng];

Hình thái—Đếm đối tượng

Hình thái học [hay hình thái toán học] là một khung và tập hợp các phương pháp xử lý ảnh để đo và phân tích các hình dạng cơ bản. Hình thái thường được áp dụng cho ảnh nhị phân nhưng cũng có thể được sử dụng với thang độ xám. Ảnh nhị phân là ảnh trong đó mỗi pixel chỉ nhận hai giá trị, thường là 0 và 1. Hình ảnh nhị phân thường là kết quả của việc tạo ngưỡng cho hình ảnh, ví dụ như với mục đích đếm các đối tượng hoặc đo kích thước của chúng. Một bản tóm tắt hay về hình thái học và cách thức hoạt động của nó có trong http. // vi. wikipedia. org/wiki/Mathematical_morphology

Các hoạt động hình thái được bao gồm trong mô-đun

pil_im = Image.open['empire.jpg'].convert['L']
42
pil_im = Image.open['empire.jpg'].convert['L']
48. Các chức năng đếm và đo lường cho hình ảnh nhị phân nằm trong mô-đun
pil_im = Image.open['empire.jpg'].convert['L']
42
pil_im = Image.open['empire.jpg'].convert['L']
50. Hãy xem một ví dụ đơn giản về cách sử dụng chúng

Xem xét hình ảnh nhị phân trong Hình 1-12. [] Đếm các đối tượng trong hình ảnh đó có thể được thực hiện bằng cách sử dụng

from PIL import Image

pil_im = Image.open['empire.jpg']
11

Điều này tải hình ảnh và đảm bảo rằng nó là nhị phân bằng cách tạo ngưỡng. Nhân với 1 sẽ chuyển đổi mảng boolean thành nhị phân. Sau đó, hàm

pil_im = Image.open['empire.jpg'].convert['L']
51 tìm các đối tượng riêng lẻ và gán nhãn số nguyên cho các pixel theo đối tượng mà chúng thuộc về. Hình 1-12 hiển thị mảng nhãn. Các giá trị mức xám cho biết chỉ mục đối tượng. Như bạn có thể thấy, có những kết nối nhỏ giữa một số đối tượng. Sử dụng một thao tác gọi là mở nhị phân, chúng ta có thể loại bỏ chúng

from PIL import Image

pil_im = Image.open['empire.jpg']
12

Đối số thứ hai của

pil_im = Image.open['empire.jpg'].convert['L']
52 chỉ định phần tử cấu trúc, một mảng cho biết những gì hàng xóm sẽ sử dụng khi căn giữa một pixel. Trong trường hợp này, chúng tôi đã sử dụng 9 pixel [4 ở trên, chính pixel và 4 ở dưới] theo hướng y và 5 theo hướng x. Bạn có thể chỉ định bất kỳ mảng nào làm phần tử cấu trúc; . Các lần lặp tham số xác định số lần áp dụng thao tác. Hãy thử điều này và xem số lượng đối tượng thay đổi như thế nào. Hình ảnh sau khi mở và hình ảnh nhãn tương ứng được hiển thị trong Hình 1-12. Như bạn có thể mong đợi, có một hàm tên là
pil_im = Image.open['empire.jpg'].convert['L']
53 thực hiện ngược lại. Chúng tôi để lại chức năng đó và các chức năng khác trong
pil_im = Image.open['empire.jpg'].convert['L']
48 và
pil_im = Image.open['empire.jpg'].convert['L']
50 cho các bài tập. Bạn có thể tìm hiểu thêm về chúng từ tài liệu
pil_im = Image.open['empire.jpg'].convert['L']
42 http. // tài liệu. scipy. org/doc/scipy/tham khảo/ndimage. html

Hình 1-12. Một ví dụ về hình thái học. Mở nhị phân để tách các đối tượng, sau đó đếm chúng. [a] hình ảnh nhị phân ban đầu;

pil_im = Image.open['empire.jpg'].convert['L']
33 đi kèm với một số mô-đun hữu ích cho đầu vào và đầu ra. Hai trong số đó là
pil_im = Image.open['empire.jpg'].convert['L']
58 và
pil_im = Image.open['empire.jpg'].convert['L']
59

Đọc và viết. tập tin mat

Nếu bạn có một số dữ liệu hoặc tìm thấy một số dữ liệu thú vị được đặt trực tuyến, được lưu trữ trong Matlab's. mat, có thể đọc nó bằng cách sử dụng mô-đun

pil_im = Image.open['empire.jpg'].convert['L']
60. Đây là cách để làm điều đó

from PIL import Image

pil_im = Image.open['empire.jpg']
13

Dữ liệu đối tượng hiện chứa một từ điển với các khóa tương ứng với tên biến được lưu trong bản gốc. tập tin mat. Các biến ở định dạng mảng. Đang lưu vào. tập tin mat cũng đơn giản như nhau. Chỉ cần tạo một từ điển với tất cả các biến bạn muốn lưu và sử dụng

pil_im = Image.open['empire.jpg'].convert['L']
61

from PIL import Image

pil_im = Image.open['empire.jpg']
14

Điều này lưu mảng x để nó có tên “x” khi đọc vào Matlab. Thông tin thêm về

pil_im = Image.open['empire.jpg'].convert['L']
60 có thể được tìm thấy trong tài liệu trực tuyến, http. // tài liệu. scipy. org/doc/scipy/tham khảo/io. html

Vì chúng ta đang thao tác với hình ảnh và thực hiện tính toán bằng cách sử dụng các đối tượng mảng, nên có thể lưu chúng trực tiếp dưới dạng tệp hình ảnh sẽ rất hữu ích. [] Nhiều hình ảnh trong cuốn sách này được tạo giống như thế này

Chức năng

pil_im = Image.open['empire.jpg'].convert['L']
63 có sẵn thông qua mô-đun
pil_im = Image.open['empire.jpg'].convert['L']
64. Để lưu một mảng im vào tệp, chỉ cần làm như sau

from PIL import Image

pil_im = Image.open['empire.jpg']
15

Mô-đun

pil_im = Image.open['empire.jpg'].convert['L']
64 cũng chứa hình ảnh thử nghiệm nổi tiếng “Lena”

from PIL import Image

pil_im = Image.open['empire.jpg']
16

Điều này sẽ cung cấp cho bạn phiên bản mảng thang độ xám 512 × 512 của hình ảnh

Chúng tôi kết thúc chương này với một ví dụ rất hữu ích, khử nhiễu hình ảnh. Khử nhiễu hình ảnh là quá trình loại bỏ nhiễu hình ảnh đồng thời cố gắng bảo toàn các chi tiết và cấu trúc. Chúng tôi sẽ sử dụng mô hình khử nhiễu Rudin-Osher-Fatemi [ROF] ban đầu được giới thiệu trong [28]. Loại bỏ nhiễu khỏi hình ảnh rất quan trọng đối với nhiều ứng dụng, từ việc làm cho ảnh kỳ nghỉ của bạn trông đẹp hơn đến cải thiện chất lượng ảnh vệ tinh. Mô hình ROF có một đặc tính thú vị là nó tìm thấy một phiên bản mượt mà hơn của hình ảnh trong khi vẫn giữ được các cạnh và cấu trúc

Toán học cơ bản của mô hình ROF và các kỹ thuật giải khá nâng cao và nằm ngoài phạm vi của cuốn sách này. Chúng tôi sẽ giới thiệu ngắn gọn, đơn giản trước khi trình bày cách triển khai bộ giải ROF dựa trên thuật toán của Chambolle [5]

Tổng biến thể [TV] của hình ảnh [thang độ xám] I được định nghĩa là tổng của định mức độ dốc. Trong một đại diện liên tục, đây là

Phương trình 1-1.  

Trong một cài đặt rời rạc, tổng biến thể trở thành

trong đó tổng được lấy trên tất cả các tọa độ hình ảnh x = [x, y]

Trong phiên bản Chambolle của ROF, mục tiêu là tìm một hình ảnh khử nhiễu U giảm thiểu tối thiểu

tiêu chuẩn ở đâu. tôi – bạn. đo sự khác biệt giữa U và ảnh gốc I. Về bản chất, điều này có nghĩa là mô hình tìm kiếm các hình ảnh “phẳng” nhưng cho phép “nhảy” ở các cạnh giữa các vùng

Theo công thức trong bài báo, đây là mã

from PIL import Image

pil_im = Image.open['empire.jpg']
17

Trong ví dụ này, chúng tôi đã sử dụng hàm

pil_im = Image.open['empire.jpg'].convert['L']
66, đúng như tên gọi, hàm này “cuộn” các giá trị của một mảng theo chu kỳ quanh một trục. Điều này rất thuận tiện cho việc tính toán sự khác biệt của hàng xóm, trong trường hợp này là các công cụ phái sinh. Chúng tôi cũng đã sử dụng
pil_im = Image.open['empire.jpg'].convert['L']
67, đo lường sự khác biệt giữa hai mảng [trong trường hợp này, ma trận hình ảnh U và Uold]. Lưu hàm
pil_im = Image.open['empire.jpg'].convert['L']
68 vào tệp rof. py

Hãy bắt đầu với một ví dụ tổng hợp về một hình ảnh nhiễu

from PIL import Image

pil_im = Image.open['empire.jpg']
18

Hình ảnh kết quả được hiển thị trong Hình 1-13 cùng với hình ảnh gốc. Như bạn có thể thấy, phiên bản ROF bảo toàn các cạnh một cách độc đáo

Hình 1-13. Một ví dụ về khử nhiễu ROF của một ví dụ tổng hợp. [a] hình ảnh nhiễu ban đầu;

Hình 1-14. Một ví dụ về khử nhiễu ROF của hình ảnh thang độ xám. [a] ảnh gốc;

Bây giờ, hãy xem điều gì xảy ra với một hình ảnh thực

from PIL import Image

pil_im = Image.open['empire.jpg']
19

Kết quả sẽ giống như Hình 1-14, cũng hiển thị một phiên bản mờ của cùng một hình ảnh để so sánh. Như bạn có thể thấy, khử nhiễu ROF bảo toàn các cạnh và cấu trúc hình ảnh đồng thời làm mờ “nhiễu. ”

Từ Chương 2 trở đi, chúng tôi cho rằng PIL,

box = [100,100,400,400]
region = pil_im.crop[box]
59 và
from PIL import Image

pil_im = Image.open['empire.jpg']
43 được bao gồm ở đầu mỗi tệp bạn tạo và trong mọi ví dụ về mã như

box = [100,100,400,400]
region = pil_im.crop[box]
0

Điều này làm cho mã ví dụ sạch hơn và bản trình bày dễ theo dõi hơn. Trong trường hợp chúng tôi sử dụng các mô-đun

pil_im = Image.open['empire.jpg'].convert['L']
33, chúng tôi sẽ khai báo rõ ràng rằng trong các ví dụ

Những người theo chủ nghĩa thuần túy sẽ phản đối kiểu nhập khẩu chăn này và nhấn mạnh vào một cái gì đó như

box = [100,100,400,400]
region = pil_im.crop[box]
1

để có thể giữ các không gian tên [để biết từng chức năng đến từ đâu] và chỉ nhập phần

pil_im = Image.open['empire.jpg'].convert['L']
72 của
from PIL import Image

pil_im = Image.open['empire.jpg']
43, vì không cần thiết phải nhập phần
box = [100,100,400,400]
region = pil_im.crop[box]
59 với
from PIL import Image

pil_im = Image.open['empire.jpg']
46. Những người theo chủ nghĩa thuần túy và các lập trình viên có kinh nghiệm biết sự khác biệt và có thể chọn bất kỳ tùy chọn nào họ thích. Vì muốn độc giả dễ dàng tiếp cận nội dung và các ví dụ trong cuốn sách này, tôi đã chọn không làm điều này

Chủ Đề