3

誰でもこの問題を解決するのを手伝ってもらえますか:?

以下の imoverlay 関数を使用しています。

ボックスの画像 (磁気画像) を重ねて、「キャニー」エッジ検出を使用して緑色の境界エッジが表示されるようにします。

画像 (.jpg ファイル) をスキャンし、緑のエッジのピクセル位置を見つけて、この位置を取り、(磁気画像の) 2D サーフェス プロットで x、y 位置に変換できるようにします。

以下のプログラムでは、「pixelColor」は 64 を超えませんが、「get(gca, 'CLim')」は 256 色を示します。

緑の「キャニー」エッジのピクセル位置を見つけることができるように、このプログラムを変更するにはどうすればよいですか? ポジションごとに1ポイントが必要な場合。

よろしくお願いします、

ブレンダン・ダラー

============================= 「forループ」と画像の「配列」を使用した最初の試みはそうではありませんでしたk = [0 0 1] では機能しますが、k = [0 1 0] => 緑では機能しません。緑は pixelColor > 64 にあると思います:

figure,
       I1 = imread('cigarTinNoGridGrayscale6f.jpg');
       I2 = rgb2gray(I1);
       I = imresize(I2, [500 500])
       bw = edge(I, 'canny', 0.61, sqrt(1000));
       rgb = imoverlay(I, bw, [0 1 0]);
       imshow(rgb)

h = imagesc(rgb);
get(h, 'CDataMapping')
get(gca, 'CLim')
%ans =  0   255
map = get(gcf, 'Colormap');

c = 0;
cannyXYZ=zeros(15500,3);
for i=1:500 % pixel columns of image
    for j=1:500 % pixel rows
        pixelColor = rgb(i,j);
        if pixelColor == 0   % won't allow pixelColor = 0
            pixelColor = 1;
        end
        %%{
        if pixelColor >= 65 % won't allow pixelColor > 64
            pixelColor = 64;
        end
        %%}
        k = map(pixelColor,:);
        if k(1,1) == 0 && k(1,2) == 1 && k(1,3) == 0   %(=> green)
            c = c + 1;
            cannyXYZ(c,1) = i*117/500;
            cannyXYZ(c,2) = j*117/500;
            cannyXYZ(c,3) = fo(cannyXYZ(c,1),cannyXYZ(c,2));
        end
    end
end

dlmwrite('cannyXYZ3.txt', cannyXYZ, 'delimiter', '\t', ...
         'precision', 6)


function out = imoverlay(in, mask, color)
%IMOVERLAY Create a mask-based image overlay.
%   OUT = IMOVERLAY(IN, MASK, COLOR) takes an input image, IN, and a binary
%   image, MASK, and produces an output image whose pixels in the MASK
%   locations have the specified COLOR.
%
%   IN should be a grayscale or an RGB image of class uint8, uint16, int16,
%   logical, double, or single.  If IN is double or single, it should be in
%   the range [0, 1].  If it is not in that range, you might want to use
%   mat2gray to scale it into that range.
%
%   MASK should be a two-dimensional logical matrix.
%
%   COLOR should be a 1-by-3 vector of values in the range [0, 1].  [0 0 0]
%   is black, and [1 1 1] is white.
%
%   OUT is a uint8 RGB image.
%
%   Examples
%   --------
%   Overlay edge detection result in green over the original image.
%       
%       I = imread('cameraman.tif');
%       bw = edge(I, 'canny');
%       rgb = imoverlay(I, bw, [0 1 0]);
%       imshow(rgb)
%
%   Treating the output of peaks as an image, overlay the values greater than
%   7 in red.  The output of peaks is not in the usual grayscale image range
%   of [0, 1], so use mat2gray to scale it.
%
%       I = peaks;
%       mask = I > 7;
%       rgb = imoverlay(mat2gray(I), mask, [1 0 0]);
%       imshow(rgb, 'InitialMagnification', 'fit')

%   Steven L. Eddins
%   Copyright 2006-2012 The MathWorks, Inc.

% If the user doesn't specify the color, use white.
DEFAULT_COLOR = [1 1 1];
if nargin < 3
    color = DEFAULT_COLOR;
end

% Force the 2nd input to be logical.
mask = (mask ~= 0);

% Make the uint8 the working data class.  The output is also uint8.
in_uint8 = im2uint8(in);
color_uint8 = im2uint8(color);

% Initialize the red, green, and blue output channels.
if ndims(in_uint8) == 2
    % Input is grayscale.  Initialize all output channels the same.
    out_red   = in_uint8;
    out_green = in_uint8;
    out_blue  = in_uint8;
else
    % Input is RGB truecolor.
    out_red   = in_uint8(:,:,1);
    out_green = in_uint8(:,:,2);
    out_blue  = in_uint8(:,:,3);
end

% Replace output channel values in the mask locations with the appropriate
% color value.
out_red(mask)   = color_uint8(1);
out_green(mask) = color_uint8(2);
out_blue(mask)  = color_uint8(3);

% Form an RGB truecolor image by concatenating the channel matrices along
% the third dimension.
out = cat(3, out_red, out_green, out_blue);

================================================

4

2 に答える 2