2017-02-19 3 views
0

В другом потоке, я нашел этот кусок кода, чтобы сделать круг, который имеет градиент в нем (plot circle with gradient gray scale color in matlab):Создание окружности с градиентом

N = 200; %// this decides the size of image 
[X,Y] = meshgrid(-1:1/N:1, -1:1/N:1) ; 
nrm = sqrt(X.^2 + Y.^2); 
out = uint8(255*(nrm/min(nrm(:,1)))); %// output image 
padsize = 50; %// decides the boundary width 
out = padarray(out,[padsize padsize],0); 
figure, imshow(out) %// show image 

Теперь я хотел бы заменить этот градиент с фиксированный вектор убывающих значений, так что каждый радиус имеет свою собственную ценность.

Заранее спасибо за любую помощь по этому

+1

Так что же * вы * делать еще? Вы только публикуете чужую работу. Также, пожалуйста, задайте вопрос, вы этого не сделали. Вопросы на английском языке обозначаются вопросительным знаком «?» И могут получать ответ. Пожалуйста, прочитайте [ask]. – Adriaan

+0

укажите ссылку на другую тему, которую вы упомянули. – Shai

+0

Ссылка добавлена. Извините, я новичок здесь и до сих пор учился .... – KayPi

ответ

1

Вот это элегантный способ заменить элементы со значениями из вектора:

Предположим, ваш вектор: V = 283:-1:0.
Я использовал нисходящие значения для демонстрации.
Значение 283 равно sqrt(2)*N (предполагается, что это максимальный радиус в ограничительном квадрате).

Код отличия от оригинального поста:

  1. Разделить out по max(out(:)) - установить диапазон отказа в [0, 1].
  2. Умножьте длину V (минус 1) - установите диапазон [0, length(V)-1].
  3. Используйте круглую форму вместо uint8 (преобразование в uint8 значения зажима в 255).
  4. Использовать вектор V в качестве таблицы поиска - замените каждый элемент out на V вместо значения.

Вот код:

N = 200; %// this decides the size of image 

%V = round(sqrt(2)*N):-1:0; 

%Assume this is your vector. 
V = 283:-1:0; 

[X,Y] = meshgrid(-1:1/N:1, -1:1/N:1) ; 
nrm = sqrt(X.^2 + Y.^2); 
%out = uint8(255*(nrm/min(nrm(:,1)))); %// output image 

%1. Divide by max(out(:)) - set the range of out to [0, 1]. 
%2. Multiply by length of V (minus 1) - set the range of out to [0, length(V)-1]. 
%3. Use round instead of uint8 (converting to uint8 clamps value to 255). 
out = nrm/min(nrm(:,1)); 
out = round(out/max(out(:)) * (length(V)-1)); 

%4. Use vector V as a Look Up Table - replace each elements of out with value of V in place of the value. 
out = V(out+1); 

padsize = 50; %// decides the boundary width 
out = padarray(out,[padsize padsize],0); 
%figure, imshow(out) %// show image 
figure, imagesc(out);impixelinfo;colormap hsv %// use imagesc for emphasis values. 

Как вы можете видеть, значения берутся из вектора V.

enter image description here

0

Попробуйте

R = sqrt(X.^2+Y.^2); 
out = uint8(255*R); 
padsize = 50; %// decides the bounary width 
out = padarray(out,[padsize padsize],0); 
figure, imshow(out) %// show image 
+0

Спасибо! Наверное, я плохо описал проблему. Я пытаюсь сделать градиент в соответствии с вектором с длиной = радиус круга. Это своего рода работа с заменой всех значений в определенной форме эксцентриситета центром на значения в векторе. Но это код выглядит не очень элегантно ... – KayPi

Смежные вопросы