How to add box to an image?
57 ビュー (過去 30 日間)
古いコメントを表示
Hi
I have two images ('yellow.png' and 'bird.png'). See below.
How can I make a box AROUND the image borders with self-defined box colours, say all four lines with grey colour [0.5 0.5 0.5]?
See below.
Please can you help?
7 件のコメント
Adam Danz
2019 年 8 月 28 日
編集済み: Adam Danz
2019 年 8 月 30 日
"The images were first generated in Matlab"
Maybe it would be easier if you altered the code that generated the image. Adding the frame is just 1 line of code. But if you have read the images back into matlab, that's going to be more work.
Based on the code and image in your other comment, it appears the image's bottom, left corner is not at (0,0) where your rectangle starts. See answer.
DGM
2022 年 7 月 16 日
A grayscale border can be added using IPT padarray(). A colored border requires extra steps, though alternative methods exist. See the following reference answer, which shows various possibilities.
採用された回答
Image Analyst
2019 年 8 月 30 日
編集済み: Image Analyst
2019 年 8 月 30 日
If the bad lines are always the rightmost one and the bottom one, you can simply crop the image to not include those:
rgbImage = rgbImage(1:end-1, 1:end-1, :);
To pad the image with certain color, you can use padarray() on each color channel. There are other ways. Let me know if it's still a problem for you.
0 件のコメント
その他の回答 (3 件)
Adam Danz
2019 年 8 月 28 日
編集済み: Adam Danz
2019 年 9 月 2 日
Use the handle output from imshow to get the image's coordinates. The XData and YData properties will provide you with the coordinates of the image. Unless the image coordinates are specified in imshow() inputs, the first pixel is centered at coordinate (1,1) so the rectangle should begin at (0.5, 0.5). To expand the rectangle to the outer edges, you must add 1 to the width and height indicated by ranges of XData and YData.
% When the image is in pixel units
corn_gray = imread('corn.tif',3);
h = imshow(corn_gray);
rh = rectangle('position',[ ...
h.XData(1)-.5,...
h.YData(1)-.5,...
range(h.XData)+1,...
range(h.YData)+1],...
'EdgeColor', 'r','linewidth',2);
When the image is not in pixel units, XData and YData properties of the image object may no longer indicate the pixel centers so you must compute the location of the pixel edges.
% When the image is not in pixel units
corn_gray = imread('corn.tif',3);
h = imshow(corn_gray,'XData',200:400,'YData',110:4000); %(arbitrary xdata,ydata)
axis square
axis on % optional, to see axis scales
pixelRatio = [range(h.XData)/size(corn_gray,2), range(h.YData)/size(corn_gray,1)];
rh = rectangle('position',[ ...
h.XData(1)-pixelRatio(1)/2,...
h.YData(1)-pixelRatio(2)/2,...
range(h.XData)+pixelRatio(1),...
range(h.YData)+pixelRatio(2)],...
'EdgeColor', 'r','linewidth',2);
% Expand the axis limits to show full frame
xlim(xlim()+[-.01,.01]*range(xlim())) % add 1% to the x axis limits
ylim(ylim()+[-.01,.01]*range(ylim())) % add 1% to the y axis limits
0 件のコメント
Image Analyst
2019 年 8 月 31 日
Images rows and columns start with 1, not zero. so do this:
rectangle('position', [1, 1, s(2), s(1)], 'edgecolor', [1 0 0])
If some part of the rectangle is still missing (outside the image), try adding or subtracting 0.5 or 1 to the position values until you can see it. Like perhaps
rectangle('position', [1, 1, s(2) - 1, s(1) - 1], 'edgecolor', [1 0 0])
5 件のコメント
Adam Danz
2019 年 9 月 3 日
編集済み: Adam Danz
2019 年 9 月 3 日
Then you should have accepted Image Analyst's answer rather than your modification of another person's work.
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!