我在matlab中有一个图像。我试图让每个第二个像素变灰。有人会知道怎么做吗?
答案 0 :(得分:1)
1)阅读图片:
rgbImage = imread('photo.jpg');
2)转换为单元格数组,其中每个元素代表一个像素,但是1x1x3 uint8 rgb triplet:
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);
编辑 棋盘
如果您希望将图像彩色为棋盘格,无论图像尺寸如何,步骤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是偶数。
答案 1 :(得分:0)
创建棋盘图案的最简单方法可能是创建一个矩形网格(ndgrid
),然后使用mod
查找列和行索引总和为偶数的所有元素。
TabItem tb = _tabcntrl.SelectedItem;
var childControls = control.Children.OfType<UserControl>(); // your controltype
// I'm looping through all child controls of type 'UserControl' but you can customize to your case.
foreach(var control in childControls)
{
// execute control logic here
control.test();
}
创建同一逻辑sz = size(rgbImage);
[row, col] = ndgrid(1:sz(1), 1:sz(2));
checkers = logical(mod(row + col, 2));
矩阵的另一种方法是使用bsxfun
,这将大大减少先前操作所消耗的内存。
checkers
现在我们只需要使用这个逻辑矩阵索引到checkers = bsxfun(@(x,y)mod(x + y, 2), 1:size(rgbImage, 1), (1:size(rgbImage, 2)).').';
并将相关值设置为灰色(128)。一种简单的方法是展平rgbImage
的第一维,以便我们可以使用逻辑矩阵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
的白色部分,您绝对可以这样做。为此,您需要创建一个逻辑矩阵,指示白色像素的位置。然后你想找到棋盘图案的位置AND(rgbImage
),其中像素为白色。
&
然后以相同的方式应用此模式。
isWhite = all(rgbImage == 255, 3); % White pixels where all channels = 255
tochecker = checkers & isWhite; % Combine with checkerboard
如果我们将此应用于您帖子中的图片,我们会收到以下内容