Help With Scaling Image Without Using Toolbox
이전 댓글 표시
I am trying to scale an image using affine transformation. I am using an image of resolution 256x256. I have a code that looks something like as below :
i = imread('DIP/pic.jpg');
R = uint8(zeros(size(i)));
for x = 1:256
for y = 1:256
v = 0.25*x;
w = 0.25*y;
i(x,y) = R(v,w);
end
end
imshow(i);
imshow(R);
However whenever I run the script, I get the error Subscript indices must either be real positive integers or logicals.
I know I could just use the toolbox but I am not doing so to see how can I actually implement affine transformation as it would help me with getting a better understanding of image processing.
Thanks
답변 (2개)
Walter Roberson
2018년 2월 28일
편집: Walter Roberson
2018년 2월 28일
0 개 추천
Try the case of x=1 y=1. v=0.25*x so v=0.25, and likewise for w. You then try to use those 0.25 as subscripts.
댓글 수: 5
Yawar Khalid
2018년 2월 28일
Jan
2018년 2월 28일
@Yawar Khalid: Of course the error persists. Walter did not mean, that you should try this, but explained, that trying this is the problem. R(0.25, 0.25) is an error, because indices must be positive integers.
Which dimension does R have? Maybe you mean:
v = 4 * x;
w = 4 * y;
i(x,y) = R(v,w);
or
v = ceil(0.25 * x);
w = ceil(0.25 * y);
i(x,y) = R(v,w);
Yawar Khalid
2018년 2월 28일
편집: Yawar Khalid
2018년 2월 28일
Jan
2018년 2월 28일
@Yawar: In "i(x,y) = R(v,w);" you overwrite the pixels of "i". It is not clear why you insert data from the zero matrix to the imported image. It it also not clear, if your input or output has 64x64 or 256x256 pixels.
Please post clearly, what you want to achieve:
- What are the inputs (size and type)
- What is the wanted output (size and type)
- By which operation do you want to achieve it?
Yawar Khalid
2018년 3월 1일
Jan
2018년 2월 28일
img = imread('DIP/pic.jpg');
x = round(linspace(1, size(img, 2), 256));
y = round(linspace(1, size(img, 1), 256));
idx = sub2ind(size(img), y, x);
R = reshape(img(idx), 256, 256);
By the way:
R = zeros(size(img), 'uint8');
is more efficient than creating a double array at first (with 8 bytes per element) and converting it to an uint8 afterwards.
댓글 수: 4
Yawar Khalid
2018년 2월 28일
Jan
2018년 2월 28일
round, ceil, linspace, size, imread and imshow are toolbox functions. Implicitly a=b calls the toolbox function subsasgn also and 0.25*x calls the built-in times. reshape does only change the dimensions of the matrix without touching the data in any way. If this is too much for you already, I cannot offer any useful help.
Yawar Khalid
2018년 3월 1일
Walter Roberson
2018년 3월 1일
Jan, you missed that .jpg are almost always 3D.
카테고리
도움말 센터 및 File Exchange에서 Matrix Indexing에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!