我有一张图像和一张从原始图像中裁剪出的子图像。
这是我到目前为止编写的代码:
val1 = imread(img);
val2 = imread(img_w);
gray1 = rgb2gray(val1);%grayscaling both images
gray2 = rgb2gray(val2);
matchingval = normxcorr2(gray1,gray2);%normalized cross correlation
[max_c,imax]=max(abs(matchingval(:)));
在此之后我被卡住了。我不知道如何更改整个图像灰度,除了应该是彩色的子图像。
我该怎么做?
谢谢。
答案 0 :(得分:0)
如果您知道图像的坐标是什么,您可以随时只在感兴趣的部分使用rgb2gray。
例如,我刚才在图像上试过这个:
im(500:1045,500:1200,1)=rgb2gray(im(500:1045,500:1200,1:3));
im(500:1045,500:1200,2)=rgb2gray(im(500:1045,500:1200,1:3));
im(500:1045,500:1200,3)=rgb2gray(im(500:1045,500:1200,1:3));
我在这里拍摄了行(500到1045),列(500到1200)和图像的rgb深度(1到3),并将rgb2gray函数应用到了这一点。我做了三次,因为rgb2gray的输出是2d矩阵,彩色图像是3d矩阵,所以我需要逐层更改它。
这对我有用,只使图像的一部分变成灰色,但其余部分保持颜色。
您可能遇到的问题是,彩色图像是3维,而灰度图只需要2维。组合它们意味着灰度必须在3d矩阵中。
根据您的想法,此技术可能有所帮助,也可能无效。
答案 1 :(得分:0)
从您的代码判断,您正在阅读MATLAB中的图像和子图像。您需要知道的是提取子图像的位置的坐标。完成后,只需将原始彩色图像转换为灰度,然后在第三维中将此图像复制三次。您需要这样做,以便您可以在此图像中放置颜色像素。
对于RGB图像,灰度图像的RGB分量都相同。在第三维中复制此图像三次会创建RGB版本的灰度图像。完成后,只需使用提取子图像的位置的行和列坐标,并将其放入等效的RGB灰度图像中。
因此,给定存储在img
中的彩色图像和存储在imgsub
中的子图像,并指定在row1,col1
和row2,col2
中提取子图像的行和列{1}} - row1,col1
是子图像的左上角,row2,col2
是右下角,请执行以下操作:
img_gray = rgb2gray(img);
img_gray = cat(3, img_gray, img_gray, img_gray);
img_gray(row1:row2, col1:col2,:) = imgsub;
为了证明这一点,让我们用MATLAB中的图像来试试这个。我们将使用MATLAB中图像处理工具箱的onion.png
图像。因此:
img = imread('onion.png');
我们还要定义row1,col1,row2,col2
:
row1 = 50;
row2 = 90;
col1 = 80;
col2 = 150;
让我们得到子图像:
imgsub = img(row1:row2,col1:col2,:);
运行上面的代码,这是我们得到的图像:
答案 2 :(得分:0)
我使用与rayryeng's answer相同的示例,并尝试通过HSV
转换来解决。
基本思想是将第二层即饱和层设置为0
(因此它们是grayscale
)。然后仅为子图像区域用原始饱和度层重写图层,这样它们就会有饱和度值。
<强>代码:强>
img = imread('onion.png');
img = rgb2hsv(img);
sPlane = zeros(size(img(:,:,1)));
sPlane(50:90,80:150) = img(50:90,80:150,2);
img(:,:,2) = sPlane;
img = hsv2rgb(img);
imshow(img);
输出(与rayryeng's output相同)
相关答案以及更多详情here