Một khi trở lại tôi đã đi qua mã của imresize
chức năng trong MATLAB Image Processing Toolbox để tạo ra một phiên bản đơn giản cho chỉ nội suy lân cận gần nhất của hình ảnh. Dưới đây là làm thế nào nó sẽ được áp dụng cho vấn đề của bạn:
%# Initializations:
scale = [2 2]; %# The resolution scale factors: [rows columns]
oldSize = size(inputImage); %# Get the size of your image
newSize = max(floor(scale.*oldSize(1:2)),1); %# Compute the new image size
%# Compute an upsampled set of indices:
rowIndex = min(round(((1:newSize(1))-0.5)./scale(1)+0.5),oldSize(1));
colIndex = min(round(((1:newSize(2))-0.5)./scale(2)+0.5),oldSize(2));
%# Index old image to get new image:
outputImage = inputImage(rowIndex,colIndex,:);
Một lựa chọn khác là sử dụng được xây dựng trong interp2
chức năng, mặc dù bạn đã đề cập không muốn sử dụng các chức năng tích hợp sẵn trong một trong những bình luận của bạn.
EDIT: GIẢI THÍCH
Trong trường hợp có ai quan tâm, tôi nghĩ rằng tôi muốn giải thích cách giải pháp trên hoạt động ...
newSize = max(floor(scale.*oldSize(1:2)),1);
Thứ nhất, để có được những hàng và cột kích thước mới kích thước hàng và cột cũ được nhân với hệ số tỷ lệ. Kết quả này được làm tròn xuống số nguyên gần nhất với floor
. Nếu yếu tố quy mô nhỏ hơn 1, bạn có thể kết thúc với một trường hợp kỳ lạ của một trong những giá trị kích thước là 0, đó là lý do cuộc gọi đến max
ở đó để thay thế bất cứ điều gì ít hơn 1 với 1.
rowIndex = min(round(((1:newSize(1))-0.5)./scale(1)+0.5),oldSize(1));
colIndex = min(round(((1:newSize(2))-0.5)./scale(2)+0.5),oldSize(2));
Tiếp theo, một bộ chỉ mục mới được tính cho cả hàng và cột. Đầu tiên, một tập hợp các chỉ mục cho hình ảnh được lấy mẫu được tính toán: 1:newSize(...)
. Mỗi pixel hình ảnh được coi là có chiều rộng nhất định, chẳng hạn pixel 1 kéo dài từ 0 đến 1, pixel 2 kéo dài từ 1 đến 2, v.v. Do đó, "tọa độ" của pixel được coi là trung tâm, đó là lý do tại sao 0,5 được trừ khỏi các chỉ số. Các tọa độ này sau đó được chia cho hệ số tỷ lệ để đưa ra một tập hợp các tọa độ điểm ảnh trung tâm cho ảnh gốc, sau đó có 0,5 được thêm vào chúng và được làm tròn để có được một tập hợp các chỉ số nguyên cho ảnh gốc. Cuộc gọi đến min
đảm bảo rằng không có chỉ số nào trong số này lớn hơn kích thước hình ảnh gốc oldSize(...)
.
outputImage = inputImage(rowIndex,colIndex,:);
Cuối cùng, hình ảnh upsampled mới được tạo ra bằng cách đơn giản chỉ mục vào ảnh gốc.
Xin lỗi, không biết những gì tôi đã suy nghĩ - bạn cần phải lặp qua các đầu ra, không đầu vào, vì đầu ra lớn hơn. Và trong trường hợp đó, công thức của tôi sẽ cần được đảo ngược. –