cuốn sách gpt4 ai đã làm

python - Trực tiếp "vẽ" các đoạn dòng thành mảng có nhiều mảng

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 05:42:19 31 4
mua khóa gpt4 Nike

Một trong những dự án đầu tiên tôi thực hiện bằng python là mô phỏng Monte Carlo về quá trình thấm qua thanh. Mã tiếp tục phát triển. Phần đầu tiên là hình dung về quá trình thấm qua que. Vẽ mật độ (thanh/diện tích) xác định của các thanh thẳng có chiều dài nhất định trong khu vực chiều rộng*chiều dài bằng cách sử dụng tọa độ và hướng bắt đầu ngẫu nhiên. Vì tôi sử dụng gnuplot rất nhiều nên tôi ghi tọa độ bắt đầu và kết thúc (x, y) được tạo vào một tệp văn bản để sau này tôi có thể vẽ chúng bằng gnuplot.

sau đó tôi tìm thấyđâyMột cách tuyệt vời để phân tích dữ liệu hình ảnh là sử dụng scipy.ndimage.measurements. Sử dụng ndimage.imread để đọc hình ảnh ở thang độ xám. Mảng có nhiều mảng kết quả được đơn giản hóa hơn nữa thành các giá trị bool, vì tôi chỉ quan tâm đến kết nối giữa các thanh khác nhau. Sau đó, các cụm kết quả sẽ được phân tích bằng ndimage.measurements. Điều này cho phép tôi xác định xem có đường dẫn nào nối từ bên này sang bên kia hay không. Đây là một ví dụ tối thiểu.

nhập khẩu ngẫu nhiên
import math
từ các phép đo nhập scipy.ndimage
từ imread nhập scipy.ndimage
nhập numpy dưới dạng np
nhập matplotlib.pyplot dưới dạng plt

#kích thước của lô đất
chiều rộng = 10
chiều dài = 8
thanh_length = 1
fig = plt.figure(frameon=False)
ax = fig.add_axes([0, 0, 1, 1])
fig.set_figwidth(width)
fig.set_figheight(chiều dài)
ax.axis('tắt')

file = open("coordines.txt", "w")

cho tôi trong phạm vi (300):
# tạo ngẫu nhiên (x,y) tọa độ bắt đầu theo kênh và hướng
xstart = chiều rộng * ngẫu nhiên.random() # xstart = 18
ystart = chiều dài * ngẫu nhiên.random() # ystart = 2
# tạo ngẫu nhiên hướng của thanh từ tọa độ bắt đầu và chuyển đổi từ GRAD trong RAD
dirgrad = 360 * ngẫu nhiên.random()
dirrad = math.radians(dirgrad)
# tính tọa độ cuối (x,y)
xend = xstart + (math.cos(dirrad) * Stick_length)
yend = ystart + (math.sin(dirrad) * Stick_length)
# ghi tọa độ bắt đầu và kết thúc vào tệp văn bản để vẽ đồ thị gnuplot
file.write(str(i) + ":\t" + str(xstart) + "\t" + str(ystart) + "\t" + str(dirgrad) + ":\t" + str(xend) + "\t" + str(yend) + "\n")
file.write(str(i) + ":\t" + str(xend) + "\t" + str(yend) + "\n\n")
# hoặc vẽ trực tiếp bằng matplotlib
ax.plot([xstart,xend],[ystart,yend],"đen", lw=1)
fig.savefig("testimage.png", dpi=100)

# bây giờ đọc hình ảnh vừa lưu và phân tích với scipy.ndimage
fig1, ax1 = plt.subplots(1,1)
img_input = imread("testimage.png", Flatten = True) # đọc hình ảnh vào np.ndarray theo thang màu xám
img_bw = img_input < 255 # chuyển đổi thang màu xám thành b/w (boolean)
nhãn_array, num_clusters = số đo.label(img_bw) #labeled_array: các cụm được gắn nhãn trong mảng, num_clusters: số lượng cụm
diện tích = số đo.sum(img_bw, nhãn_array, chỉ mục=np.arange(labeled_array.max() + 1)) # diện tích của mỗi cụm
AreaImg = khu vực[labeled_array] # gắn nhãn cho mỗi cụm bằng nhãnnumber=area
cax = ax1.imshow(areaImg, Origin='upper', interpolation='nearest', cmap = 'rainbow')
cbar = fig1.colorbar(cax)
fig1.savefig("testimage_analyzed.png")

Mặc dù điều này chủ yếu áp dụng cho các mô phỏng Monte Carlo gồm 1000 lần lặp cho một số lượng lớn mật độ thanh khác nhau, cuối cùng chạy trong 8 giờ trở lên. Điều này một phần là do hình ảnh và mảng được tạo ra rất lớn và hàng nghìn thanh được vẽ để có mật độ cao hơn. Lý do là tôi muốn mô phỏng một loạt các hình học (ví dụ: có chiều dài từ 500 đến 20000 pixel) đồng thời giảm thiểu các lỗi do pixel hóa gây ra.

Tôi đoán cách tiếp cận tốt nhất là không sử dụng dữ liệu hình ảnh và coi nó như một vấn đề về vectơ, nhưng tôi thậm chí còn không biết cách bắt đầu thuật toán. Nhiều kết nối cũng có thể dẫn đến mảng dữ liệu lớn.

Tiếp tục với cách tiếp cận trên, rõ ràng là việc ghi dữ liệu vào một tệp và đọc lại nó không hiệu quả lắm. Vì vậy, tôi đang tìm cách để tăng tốc mọi thứ. Bước đầu tiên, tôi đã sử dụng matplotlib để tạo hình ảnh, nhưng tốc độ này chậm hơn 10 lần đối với nhiều que hơn, ít nhất là khi vẽ từng que bằng một lệnh rút thăm riêng biệt. Việc tạo danh sách tọa độ thanh trong một mảng và vẽ danh sách đầy đủ chỉ bằng một lệnh vẽ có thể tăng tốc mọi thứ nhưng vẫn có một điểm nghẽn trong việc ghi và đọc hình ảnh.

Bạn có thể cho tôi biết một cách hiệu quả để trực tiếp tạo ra một mảng có nhiều mảng kiểu bool thể hiện hình ảnh đen trắng của một cây gậy không? Có thể vẽ một danh sách tọa độ và chuyển đổi biểu đồ thành một mảng bằng cách nào đó? Tôi cũng thấy điều này thú vị cuộc thảo luậnnơi các đường được vẽ thành hình ảnh PIL. Điều này có thể nhanh hơn matplotlib không?

câu trả lời hay nhất

Vẽ các đoạn thẳng trong một mảng là chức năng cơ bản của bất kỳ thư viện đồ họa nào. Cách đơn giản nhất có lẽ là Thuật toán Bresenham .Thuật toán rất đơn giản và nhanh chóng - nghĩa là khi được triển khai bằng ngôn ngữ nhanh. Tôi không khuyên bạn nên triển khai nó bằng python thuần túy. Một nhược điểm của phiên bản đơn giản nhất của thuật toán này là nó không có tính năng khử răng cưa. hiển thị hàng "răng cưa" .Tìm kiếm "thuật toán vẽ đường" để có các phương pháp nâng cao hơn với khả năng khử răng cưa tốt hơn.

我有一个 Cython triển khai thuật toán Bresenham在我的 gói sơ đồ mắt .chức năng bres_segment_count Tăng các giá trị trong mảng đầu vào dọc theo một đường thẳng từ (x0, y0) đến (x1, y1). Việc sửa đổi việc chỉ cần đặt giá trị mảng thành 1 là một thay đổi nhỏ đối với mã.

例如,

Trong [21]: mờ = 250

Trong [22]: num_sticks = 300

gậy Mỗi hàng chứa [x0, y0, x1, y1], điểm cuối của "stick":

Trong [23]: gậy = np.random.randint(0, dim, size=(num_sticks, 4)).astype(np.int32)

Trong [24]: img = np.zeros((dim, dim), dtype=np.int32)

bres_segments_count Vẽ từng que bằng thuật toán Bresenham. Lưu ý rằng thay vì chỉ đặt giá trị trong hàng thành 1,hình ảnh Các giá trị tăng dọc theo hàng.

Trong [25]: từ eyediagram._brescount nhập bres_segments_count

Trong [26]: bres_segments_count(sticks, img)

Trong [27]: plt.imshow(img, interpolation='nearest', cmap=cm.hot)
Ra[27]:

Đây là biểu đồ kết quả:

cốt truyện gậy

Về python - trực tiếp "vẽ" các đoạn dòng thành các mảng có nhiều mảng, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/33466231/

31 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress