2016-03-14 5 views
0

У меня есть изображение в matlab. Я пытаюсь сделать каждый второй пиксикл серым. Кто-нибудь знает, как это сделать?как сделать каждый второй пиксель серого в изображении в matlab

example image

+0

подобно шахматной доски или только в определенном измерении? – Suever

+0

@Suever в шахматной доске было бы полезно, возможно ли это? – user6029533

ответ

0

Возможно, самым простым способом создания шаблона таблицы является создание прямоугольной сетки (ndgrid), а затем найти все элементы, где индексы столбца и строки суммируются с четным числом или не используют mod.

sz = size(rgbImage); 
[row, col] = ndgrid(1:sz(1), 1:sz(2)); 
checkers = logical(mod(row + col, 2)); 

Другой способ создать такую ​​же логическую матрицу checkers заключается в использовании bsxfun, которая резко уменьшить потребление памяти предыдущими операциями.

checkers = bsxfun(@(x,y)mod(x + y, 2), 1:size(rgbImage, 1), (1:size(rgbImage, 2)).').'; 

enter image description here

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

reshaped_image = reshape(rgbImage, [], 3);   % Flatten first two dims 
reshaped_image(checkers, :) = 128;     % Set all channels to 128 
newImage = reshape(reshaped_image, size(rgbImage)); % Shape it back into original 

enter image description here

Update

Если вы хотите применить этот клетчатый узор на только белые части вашего оригинального rgbImage, вы определенно можете сделать это. Для этого вам нужно создать логическую матрицу, которая указывает, где белые пиксели. Затем вы хотите найти, где шаблон шахматной доски - AND (&), где пиксели белые.

isWhite = all(rgbImage == 255, 3);  % White pixels where all channels = 255 
tochecker = checkers & isWhite;  % Combine with checkerboard 

Затем примените этот шаблон таким же образом.

reshaped_image = reshape(rgbImage, [], 3);   % Flatten first two dims 
reshaped_image(tochecker, :) = 128;     % Set all channels to 128 
newImage = reshape(reshaped_image, size(rgbImage)); % Shape it back into original 

Если применить это к изображению в вашем посте, мы получаем следующее

enter image description here

1

1) Чтение изображений:

rgbImage = imread('photo.jpg'); 

2) Преобразование в массив ячеек, где каждый элемент представляет собой пиксель, хотя 1x1x3 uint8 RGB триплет:

cellArray = mat2cell(rgbImage, ones(size(rgbImage,1),1), ones(size(rgbImage,2),1), size(rgbImage,3)); 

3) Замените каждую вторую ячейку серым цветом. Обратите внимание, мы должны сохранить оригинальный тип и размер, в противном случае следующий cell2mat приведет к ошибке:

cellArray(1:2:end) = {reshape(uint8([255,255,255]*0.1), [1,1,3])}; 

4) Преобразование обратно в матрицу и дисплей:

imageGray = cell2mat(cellArray); 
imshow(imageGray); 

EDITшахматная

Если вы хотите, чтобы изображение было окрашено как шахматная доска, независимо от размеров изображения, Шаг 3 можно заменить на:

linInd = 1:numel(cellArray); 
[i,j] = ind2sub(size(cellArray), linInd); 
toColor = mod(i+j,2) == 0; 
cellArray(linInd(toColor)) = {reshape(uint8([255,255,255]*0.1), [1,1,3])}; 

В основном мы только окрашиваем эти ячейки, i + j равно.

+0

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

+0

Привет, nirvana-mus, можно ли только окрасить пиксель в серый цвет, если пиксель белый? У меня есть черно-белое изображение, и я хотел бы иметь только клетчатые области в белых частях. Я опубликовал пример в моем оригинальном посте. – user6029533

+0

@ user6029533 Я обновил свой ответ выше этого, чтобы включить условие, что исходные пиксели должны быть белыми. – Suever

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