2017-03-16 87 views
2

我只需要使用rbbox獲得像素(相對於圖像,而不是圖像)的ROI,但是我很難從歸一化圖形座標的rbbox到圖像座標。Matlab獲取圖像內像素的rbbox(ROI)

我已經試圖乘以:圖像尺寸,圖形尺寸,屏幕尺寸,(圖像尺寸)/(圖尺寸)。還嘗試使用軸位置。

規範化意味着從0到1,所以1應該是圖像大小或數字大小,所以我嘗試應該工作!我想也許這個數字的邊界也算數...... Google這次沒有幫助。

應該有一個方法pixelStuff = FromNormalizedToImagePixels(normalizedStuff)!!

  • 圖尺寸以像素爲單位=窗口大小,無用,它包含 的邊框。
  • 我需要「圖像像素」(圖中的圖像)的投資回報率。
  • 如果我可以得到 圖中的圖像區域(沒有邊框),我可以計算ROI。

我在想什麼?

代碼示例:

close all; clc; 

figH = figure(); 
set(figH,'Units','normalized'); 
if isvalid(figH) 
    % load some image 
    imgData = imread('ImL_9.png'); 

    imshow(imgData,'Colormap', hot(256),'DisplayRange',... 
     [min(imgData(:)) max(imgData(:))],'InitialMagnification','fit'); 
    grid on; axis on; xlabel('x'); ylabel('y'); 
    axis equal; axis manual; 
    % Get image size (pixels) 
    [isy,isx] = size(imgData); 
    % Set axis to fit image 
    ax = get(figH,'CurrentAxes'); 
    set(ax,'xlim',[0 isx]); set(ax,'ylim',[0 isy]); 

    % Get mouse event to set ROI 
    k = waitforbuttonpress; 
    imgROIn = rbbox; 
    annotation('rectangle',imgROIn,'Color','red'); 

    % Get screen size 
    screenSize = get(0,'screensize'); 

    % Get figure position 
    pos = get(figH, 'Position'); 

    % Conversion 1. roi size px = roi size norm * (image size px/figure size norm) 
    cx = isx/pos(3); 
    cy = isy/pos(4); 
    conv = [cx cy cx cy]; 
    % Converts from normalized figure coordinate to image pixels coordinate 
    imgROIpx = imgROIn.*conv; 

    % Show result. imgROIpx does not match what was expected, like 
    % selecting the entire image the result should be: 0 0 isx isy 
    imgROIpx 
end 
+0

https://www.mathworks.com/help/ matlab/ref/annotation.html#inputarg_dim'要更改單位,請使用Units屬性' – Yvon

+0

我需要IMAGE座標中的ROI,圖中的圖像。以像素爲單位獲取位置將導致圖形窗口大小(包括其邊框)。 – Pedro77

+0

ok請https://stackoverflow.com/help/mcve – Yvon

回答

1

@Rotem溶液不如果工作圖像被調整大小。

我一直在尋找獲得的投資回報率,讓我找到了解決辦法是使用roipoly另 方式找到鼠標位置ginput

ROImask = roipoly; % Multi sides ROI 
% or 
[x,y] = ginput(1); % mouse position in image coordinates 
+0

我弄亂了規格化的座標格式......當屏幕內的圖形中有一個軸時,它真的很混亂。糾正我的文章並不難,但我很高興你找到了更適合你的問題的優雅解決方案。 – Rotem

1

我想我解決了這個難題。

我創建了下面的例子,其將rbbox歸一化座標中的像素到圖像座標:

close all 

%Load and display an image for testing 
I = imread('pout.tif'); 
imshow(I); 
set(gcf, 'Units', 'normalized') 
k = waitforbuttonpress; 
rect_pos = rbbox; 

%Get screen size. 
screenSize = get(0, 'ScreenSize'); 

%Screen size in pixels (width, height). 
screenSizePixels = screenSize(3:4); 

%Get figure size (normalized to [0, 1] out of screenSize). 
figPositionNormalized = get(gcf, 'Position'); 

%Get axes size (normalized to [0, 1] out of figure size). 
axesPositionNormalized = get(gca, 'Position'); 

%Convert figure size to pixels. 
figPositionPixels = figPositionNormalized.*[screenSizePixels, screenSizePixels]; 
figSizePixels = figPositionPixels(3:4); 

%Convert axes position to pixels. 
axesPositionPixels = axesPositionNormalized.*[figSizePixels, figSizePixels]; 

axesSizePixels = axesPositionPixels(3:4); 

%Subtract axes upper left corner from rect_pos. 
rect_pos(1:2) = rect_pos(1:2) - axesPositionNormalized(1:2); 

%Convert rect_pos to pixels 
rectPosPixels = rect_pos.*[figSizePixels, figSizePixels]; 

%Reverse up/down (to get coordinates in image). 
rectPosPixels(2) = axesSizePixels(2) - rectPosPixels(2); 

rectPosPixels = round(rectPosPixels); 

%Mark pixel with white rectange, and black dot. 
I(rectPosPixels(2)-1:rectPosPixels(2)+1, rectPosPixels(1)-1:rectPosPixels(1)+1) = 255; 
I(rectPosPixels(2), rectPosPixels(1)) = 0; 

%Show marked image. 
imshow(I); 

我指出用鼠標中心像素:
enter image description here

+0

好吧,但我需要的是將標準化的ROI數據轉換爲圖像像素。 – Pedro77

+0

花了我一段時間才弄清楚它...對不起,忽略你的最新編輯。 – Rotem

+0

不錯,它接縫它正確標記左下角的ROI角落。有一個問題,如果在開始投資回報率之前調整圖的大小(如最大化),它將無法工作。我正在研究它 – Pedro77