Làm thế nào để đệm pixel raster theo giá trị của chúng?


28

Các pixel ở bên trái đại diện cho các vị trí của cây và bán kính vương miện liên quan của chúng (tức là các giá trị pixel nằm trong khoảng từ 2 - 5). Tôi muốn đệm các pixel raster này bằng giá trị bán kính vương miện của chúng. Hình ảnh bên phải là những gì tôi hy vọng đạt được chỉ bằng các phương pháp xử lý raster .

Ban đầu tôi sẽ nghĩ sử dụng tổng tiêu cự tròn trong ArcGIS, mặc dù cài đặt vùng lân cận là một giá trị cố định, sẽ không tính đến bán kính vương miện có kích thước thay đổi.

Một phương pháp tốt để "đệm" pixel theo giá trị của chúng là gì?

nhập mô tả hình ảnh ở đây


2
Bạn đã thử chuyển đổi raster thành các điểm, sau đó đệm theo trường sau đó chuyển đổi trở lại raster?

2
Nó giúp nhận ra rằng đây là một hoạt động không cục bộ , bởi vì phi địa phương đó cho thấy có những giới hạn vốn có về cách tính toán có thể được thực hiện. Chẳng hạn, đầu ra của bạn sẽ thay đổi hoàn toàn ở mọi nơi nếu chỉ một pixel bị cô lập trong đầu vào là thay đổi thành một giá trị lớn. Do đó, nếu bạn biết các hạn chế đối với các giá trị đầu vào, thì vui lòng chia sẻ chúng, vì điều đó có thể dẫn đến các giải pháp cải tiến. Chẳng hạn, tất cả các giá trị đầu vào của bạn sẽ luôn nằm trong tập {2,3,4}?
whuber

@Dan Patterson Đó là cách tôi nghĩ ra hình ảnh bên phải. Tuy nhiên, tôi đang cố gắng tránh các hoạt động véc tơ hoàn toàn và tránh các bước đó.
Aaron

2
@whuber Bộ dữ liệu này đại diện cho các cây có đường kính vương miện thay đổi. Do đó, các phép đo bán kính tán cây có thể thay đổi thực tế từ 1-10. Tôi cũng nên thêm rằng đầu ra được đệm chỉ cần là 0 cho sự vắng mặt của vương miện và 1 cho sự hiện diện của vương miện.
Aaron

1
Được rồi cảm ơn. Có vẻ như bạn đã tạo đầu ra ví dụ bằng cách kết hợp 3 bộ đệm của các điểm có giá trị 3, 4 bộ đệm của các điểm có giá trị 4 và 5 bộ đệm của các điểm có giá trị 5. (Bạn dường như đã quên để xử lý các điểm có giá trị 2.) Quá trình đó không chỉ trả lời câu hỏi của bạn, mà (tôi tin) đó là giải pháp đơn giản nhất bằng cách sử dụng các công cụ có sẵn trong Spatial Analyst.
whuber

Câu trả lời:


14

Đây là một giải pháp raster thuần túy trong Python 2.7việc sử dụng numpyscipy:

import numpy as np
from scipy import ndimage
import matplotlib.pyplot as plt

#create tree location matrix with values indicating crown radius
A = np.zeros((120,320))
A[60,40] = 1
A[60,80] = 2
A[60,120] = 3
A[60,160] = 4
A[60,200] = 5
A[60,240] = 6
A[60,280] = 7

#plot tree locations
fig = plt.figure()
plt.imshow(A, interpolation='none')
plt.colorbar()

#find unique values
unique_vals = np.unique(A)
unique_vals = unique_vals[unique_vals > 0]

# create circular kernel
def createKernel(radius):
    kernel = np.zeros((2*radius+1, 2*radius+1))
    y,x = np.ogrid[-radius:radius+1, -radius:radius+1]
    mask = x**2 + y**2 <= radius**2
    kernel[mask] = 1
    return kernel

#apply binary dilation sequentially to each unique crown radius value 
C = np.zeros(A.shape).astype(bool)   
for k, radius in enumerate(unique_vals):  
    B = ndimage.morphology.binary_dilation(A == unique_vals[k], structure=createKernel(radius))
    C = C | B #combine masks

#plot resulting mask   
fig = plt.figure()
plt.imshow(C, interpolation='none')
plt.show()

Đầu vào: nhập mô tả hình ảnh ở đây

Đầu ra: nhập mô tả hình ảnh ở đây


1
+1 cho phương pháp giãn nở! Nó hoạt động với các điểm gần quá.
Antonio Falciano

Đây là một ví dụ tuyệt vời về lý do tại sao máy bay phản lực cũ đó là khủng khiếp. Điều này có vẻ rõ ràng hơn với viridis.
101

8

Cách tiếp cận dựa trên vector

Nhiệm vụ này có thể được thực hiện trong ba bước:

Lưu ý: sử dụng trường bộ đệm sẽ tránh việc tính toán bộ đệm cho mỗi giá trị bán kính vương miện.


Cách tiếp cận dựa trên raster

Tránh giải pháp dựa trên vectơ, vấn đề này đề nghị sử dụng một loại Cellular Automata dựa trên các hàng xóm gần nhất. Giả sử rằng tất cả các pixel đen là số không, các pixel được bình phương và kích thước của chúng bằng 1 (hoặc, thay vào đó, được chia tỷ lệ một cách cơ hội), các quy tắc để áp dụng rất đơn giản:

  1. Nếu giá trị pixel ( VALUE) lớn hơn 1, giá trị của nó trở thành VALUE-1và sau đó xem xét các pixel xung quanh của nó. Nếu giá trị của chúng nhỏ hơn VALUE-1, các pixel này được sinh ra hoặc tăng lên và giá trị của chúng trở thành VALUE-1. Mặt khác, các pixel này tồn tại và được giữ nguyên.
  2. Nếu VALUE<=1, không làm gì cả (pixel đã chết!).

Các quy tắc này phải được áp dụng cho đến khi tất cả các pixel bị chết, tức là các giá trị của chúng bằng 0 hoặc 1. Vì vậy, N-1thời gian, Ngiá trị tối đa bạn có trong raster đầu vào là bao nhiêu. Cách tiếp cận này có thể được thực hiện khá dễ dàng với một chút Python và numpy.


1
Cảm ơn đã trả lời afalciano. Phương pháp này là cách tôi tạo hình ảnh bên phải và sử dụng phương pháp vectơ - một cách tôi đang cố gắng tránh.
Aaron

1
Ok Aaron, đây là một cách tiếp cận dựa trên raster. Hi vọng điêu nay co ich.
Antonio Falciano

7

Một tùy chọn khác là tạo các raster riêng cho từng giá trị pixel, trong trường hợp này là 4 raster, với một điều kiện. Sau đó mở rộng các raster bằng số pixel tương ứng với giá trị của raster (bằng cách lặp lại qua danh sách giá trị). Cuối cùng, tham gia các raster (đại số hoặc không gian), để tạo một raster nhị phân cho các tán cây.


1
Ý tưởng này là đúng. Các chi tiết có thể được cải thiện: (1) lựa chọn tạo ra một chỉ báo nhị phân (0,1) của các cây có bán kính vương miện nhất định. (2) Tổng tiêu điểm của lựa chọn đó - sử dụng vùng lân cận tròn của bán kính đã cho - rất nhanh để tính toán bằng FFT. (3) Thêm tổng tiêu cự (theo chiều) và so sánh với 0 sẽ cho bộ đệm mong muốn.
whuber

7

Đây là một câu hỏi đầy thách thức để làm điều này trong raster bởi vì bạn không có cơ hội sử dụng giá trị của pixel để xác định kích thước của bộ đệm. Do đó, bạn sẽ cần thực hiện bộ lọc tiêu cự cho từng giá trị, như bạn đã nói.

Đây là một câu trả lời khả thi để thực hiện chỉ với 3 bộ lọc (tôi không thể tìm thấy ít hơn), nhưng không hoàn hảo như được đề cập bởi Whuber: bộ đệm của bạn sẽ bị cắt cụt khi các cây gần nhau.

1) EDIT: Phân bổ Euclidian (điều này không giải quyết được hoàn toàn vấn đề, vì nó cắt các bộ đệm trong vùng lân cận của các cây nhỏ hơn, nhưng nó tốt hơn các tạo tác của giải pháp đầu tiên của tôi).

2) khoảng cách eidianidian xung quanh mỗi pixel

3) máy tính raster (đại số bản đồ) với một câu lệnh có điều kiện

Con("allocation_result" > ("distance_result" / pixel_size) , 1 , 0)

Lưu ý rằng bạn có thể điều chỉnh độ dẫn tùy theo nhu cầu của bạn về bán kính (có hoặc không có pixel trung tâm)


+1 Đây là một cách tiếp cận sáng tạo. Tôi sẽ kiểm tra xem liệu có khả thi để mở rộng quy mô bằng cách sử dụng phương pháp này không.
Aaron

2
Cách tiếp cận khoảng cách Euclide sẽ không hiệu quả, bởi vì nó chỉ tính khoảng cách đến cây gần nhất , không nhất thiết là khoảng cách đến cây có vương miện bao phủ điểm.
whuber

2

Tự hỏi tại sao bạn không sử dụng công cụ mở rộng của ArcGIS ?

import arcpy
from arcpy.sa import *

raster_in  = r'c:\test.tif'
raster_out = r'c:\test_out.tif'

outExpand1 = Expand(raster_in, 2, 2)
outExpand2 = Expand(outExpand1, 3, 3)
outExpand3 = Expand(outExpand3, 4, 4)
outExpand4 = Expand(outExpand4, 5, 5)

outExpand4.save(raster_out)

Trong trường hợp chồng chéo: expandlệnh mới nhất sẽ bao gồm các lệnh trước đó.


2

Nếu bạn có vị trí pixel, bán kính và thuật toán vòng tròn Midpoint (một biến thể của Bresenham Alg.) Cung cấp cho bạn một gợi ý. IMO thật dễ dàng để tạo một đa giác từ phương pháp này và tôi nghĩ thật dễ dàng để thực hiện điều này trong Python. Một tập hợp của tập hợp đa giác này cung cấp cho bạn khu vực che phủ.


Tôi biết đó không phải là vấn đề của câu hỏi, nhưng bạn có muốn biết thêm về nguyên thủy đồ họa và quét đa giác dòng không? Đối với cirles nó rất dễ dàng. Sự kết hợp lồi là một từ thông dụng và cứ thế ....
huckfinn

Làm thế nào điều này sẽ được áp dụng bằng cách sử dụng các hoạt động raster cơ bản?
whuber

Nếu bạn cố gắng xử lý việc này trong không gian raster, hãy xác định các điểm của vòng tròn, sắp xếp chúng theo y hoặc x và lấp đầy khoảng trống bằng một đường thẳng (đường quét) đang trên đường để lấp đầy vòng tròn. Trong cách tiếp cận hình tam giác, nếu bạn xây dựng vòng tròn bằng một xấp xỉ các hình tam giác và cố gắng điền vào hình tam giác, bạn cần kiểm tra nếu điểm nằm trong hoặc bên ngoài (kết hợp lồi) và là cách khác. Và trong appoach "GIS", xây dựng các đa giác (đa giác theo định hướng đồng hồ) và tạo ra một liên minh là thứ ba (IMO là một công cụ đắt tiền nhất về mặt tính toán).
huckfinn

Để rõ ràng: Và trong appoach "GIS" ... thực hiện một hoạt động đại số như liên minh, giao lộ, chạm .... là IMO thứ ba đắt nhất tính toán.
huckfinn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.