灰度图中提取roi框的四角坐标
时间: 2023-11-11 12:02:19 浏览: 50
要提取灰度图中ROI框的四角坐标,可以使用OpenCV库中的cv2.findContours函数找到ROI框的轮廓,然后使用cv2.boundingRect函数计算轮廓的外接矩形,最后提取出矩形的四个角点坐标即可。
以下是示例代码:
```python
import cv2
# 加载灰度图
img_gray = cv2.imread('gray_image.png', cv2.IMREAD_GRAYSCALE)
# 二值化图像
_, thresh = cv2.threshold(img_gray, 127, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 计算轮廓的外接矩形
x, y, w, h = cv2.boundingRect(contours[0])
# 提取矩形的四个角点坐标
rect_corners = [(x, y), (x+w, y), (x+w, y+h), (x, y+h)]
print(rect_corners) # 输出矩形四角坐标
```
注意:以上代码仅适用于只有一个ROI框的情况。如果图像中存在多个ROI框,则需要对每个轮廓进行处理。
相关问题
用2023a版matlab写一段将四副256*256的灰度图像I1、I2、I3、I4进行灰度加权平均图像融合后的图像进行几何质心提取固定大小的有效区域,将标准图像内切圆中的内接正方形区域确定为标准图像的有效区域
很抱歉,我之前的回答中有误,请允许我重新回答你的问题。
以下是使用 MATLAB 编写的代码,实现了将四幅灰度图像进行加权平均融合后,提取有效区域并确定内接正方形的功能。
```matlab
% 读取四幅灰度图像
I1 = imread('image1.jpg');
I2 = imread('image2.jpg');
I3 = imread('image3.jpg');
I4 = imread('image4.jpg');
% 灰度加权平均图像融合
w = [0.25, 0.25, 0.25, 0.25]; % 权值
I_avg = w(1)*double(I1) + w(2)*double(I2) + w(3)*double(I3) + w(4)*double(I4);
I_avg = uint8(I_avg);
% 提取有效区域
I_bw = imbinarize(I_avg); % 二值化
I_bw = imfill(I_bw, 'holes'); % 填充孔洞
I_props = regionprops(I_bw, 'BoundingBox', 'Area', 'Centroid'); % 获取连通区域属性
[~, idx] = max([I_props.Area]); % 取面积最大的连通区域
bbox = I_props(idx).BoundingBox; % 获取包围盒
centroid = I_props(idx).Centroid; % 获取几何质心坐标
% 确定内接正方形区域
d = min(bbox(3), bbox(4)); % 取包围盒宽和高的最小值
x = bbox(1) + (bbox(3) - d) / 2; % 计算正方形左上角的坐标
y = bbox(2) + (bbox(4) - d) / 2;
I_roi = imcrop(I_avg, [x, y, d, d]); % 截取正方形区域
% 确定有效区域
r = d / 2; % 半径
mask = zeros(size(I_avg));
[x, y] = meshgrid(1:size(I_avg, 2), 1:size(I_avg, 1));
mask((x-centroid(1)).^2 + (y-centroid(2)).^2 <= r^2) = 1; % 圆形掩膜
I_valid = I_roi .* uint8(mask); % 获取有效区域
% 显示结果
figure;
subplot(2, 2, 1); imshow(I1);
subplot(2, 2, 2); imshow(I2);
subplot(2, 2, 3); imshow(I3);
subplot(2, 2, 4); imshow(I4);
figure;
subplot(1, 3, 1); imshow(I_avg);
hold on; rectangle('Position', bbox, 'EdgeColor', 'r', 'LineWidth', 2);
plot(centroid(1), centroid(2), 'r+', 'MarkerSize', 10, 'LineWidth', 2);
subplot(1, 3, 2); imshow(I_roi);
subplot(1, 3, 3); imshow(I_valid);
```
其中,前四行代码读取了四幅灰度图像,第 6 行定义了权值 w,第 8 行使用加权平均方法融合灰度图像。第 11-13 行将加权平均融合后的图像进行了二值化、孔洞填充和获取连通区域属性,得到了图像中的连通区域属性和几何质心坐标。第 14 行找到面积最大的连通区域,并获取其包围盒和几何质心坐标。第 17-20 行根据包围盒计算出内接正方形区域,第 23-28 行将标准图像内切圆中的内接正方形区域确定为标准图像的有效区域,并将结果显示出来。
注意,代码中的图片文件名需要根据实际情况进行修改。
% Grayscale weighted average image fusion a = [0.25, 0.25, 0.25, 0.25]; imf = a(1)*mat2gray(uint8(normim1)) + a(2)*mat2gray(uint8(normim2)) + a(3)*mat2gray(uint8(normim3)) + a(4)*mat2gray(uint8(normim4)); imshow(imf); % Calculation of the geometric center of mass, determination of the effective region imf_bw = imbinarize(imf); imf_bw = imfill(imf_bw, 'holes'); % 填充孔洞 imf_props = regionprops(imf_bw, 'BoundingBox', 'Area', 'Centroid'); % 获取连通区域属性 [~, idx] = max([imf_props.Area]); % 取面积最大的连通区域 bbox = imf_props(idx).BoundingBox; % 获取包围盒 centroid = imf_props(idx).Centroid; % 获取几何质心坐标 % Determine the inner square area d = min(bbox(3), bbox(4)); % 取包围盒宽和高的最小值 x = bbox(1) + (bbox(3) - d) / 2; % 计算正方形左上角的坐标 y = bbox(2) + (bbox(4) - d) / 2; imf_roi = imcrop(imf, [x, y, d, d]); % 截取正方形区域 % Determine the effective area r = d / 2; % 半径 s = sqrt(2)*r; % 正方形边长 x = centroid(1) - s/2; % 正方形左上角x坐标 y = centroid(2) - s/2; % 正方形左上角y坐标 ROI = imcrop(imf, [x y s-1 s-1]); % 提取有效区域
这段代码实现了图像融合和提取有效区域的功能。首先,将四张灰度图像(normim1、normim2、normim3、normim4)按照权重系数a进行加权平均,得到融合后的图像imf。然后,使用imbinarize函数将imf转换为二值图像,并使用imfill函数填充孔洞,得到填充后的二值图imf_bw。接着,使用regionprops函数获取imf_bw中所有连通区域的属性,并取面积最大的连通区域作为感兴趣区域。利用该区域的包围盒计算出正方形区域的左上角坐标和边长,将其用imcrop函数截取出来,即为提取的有效区域ROI。该区域的中心坐标即为几何质心坐标。最后,根据ROI的半径和边长计算出圆形区域(以几何质心为圆心,半径为正方形边长的一半)并用imcrop函数提取出来,即为有效区域。
阅读全文