写程序

[复制链接]
匿名  发表于 2023-4-19 16:31:23 |阅读模式
请帮我写个matlab程序,它可以将一张图片(后缀名是.bmp)的对角线灰度提取出来,并且用图片展示出来。输出对角线灰度最大值坐标,并以此坐标为中心点,计算6✖️6灰度均值,并且弹框显示。
回复

使用道具 举报

全部回复15 显示全部楼层
机器人Gpt 发表于 2023-4-19 16:31:56 | 显示全部楼层
好的,以下是程序的代码:
  1. clc;
  2. clear;
  3. % 读入图片并转成灰度图像
  4. img = imread('image.bmp');
  5. grayImg = rgb2gray(img);
  6. % 提取对角线像素值并找到最大值及其坐标
  7. diagonal = diag(grayImg);
  8. [maxValue, maxIndex] = max(diagonal);
  9. % 在原图上画出对角线
  10. [row, col] = size(grayImg);
  11. for i = 1:min(row, col)
  12.     grayImg(i, i) = 255;
  13. end
  14. % 在原图上标出最大值坐标
  15. grayImg(maxIndex, maxIndex) = 0;
  16. grayImg(maxIndex-1:maxIndex+1, maxIndex-1:maxIndex+1) = 0;
  17. % 计算6✖️6灰度均值并弹框显示
  18. subImg = grayImg(maxIndex-2:maxIndex+3, maxIndex-2:maxIndex+3);
  19. meanValue = mean(subImg(:));
  20. msgbox(sprintf('The mean value of 6x6 region centered at (%d,%d) is %.2f', maxIndex, maxIndex, meanValue));
  21. % 显示结果
  22. imshow(grayImg);
复制代码

请将程序保存为`diagonal_grayscale.m`,并将要处理的图片命名为`image.bmp`,放在同一文件夹下。运行程序后,会弹出一个展示提取出对角线灰度的图片,并弹出一个对话框展示对角线灰度最大值坐标和6x6灰度均值。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

匿名  发表于 2023-4-19 17:12:13
机器人Gpt 发表于 2023-4-19 16:31
好的,以下是程序的代码:


调试程序,提示错误错误使用 rgb2gray>parse_inputs (line 77)
MAP 必须为 m x 3 的数组。

出错 rgb2gray (line 52)
[X, threeD] = parse_inputs(X);
回复 支持 反对

使用道具 举报

机器人Gpt 发表于 2023-4-19 17:12:48 | 显示全部楼层
鹿茸 发表于 2023-04-19 17:12
调试程序,提示错误错误使用 rgb2gray>parse_inputs ( ...

这个错误通常出现在输入的图像不是RGB格式,或者RGB数据有误。因此,我们可以尝试使用imread函数读取图片并转为灰度图像,避免使用rgb2gray函数出错。以下是修改后的程序代码:
  1. clc;
  2. clear;
  3. % 读入图片并转成灰度图像
  4. img = imread('image.bmp');
  5. if size(img, 3) == 3
  6.     grayImg = rgb2gray(img);
  7. else
  8.     grayImg = img;
  9. end
  10. % 提取对角线像素值并找到最大值及其坐标
  11. diagonal = diag(grayImg);
  12. [maxVal, maxIndex] = max(diagonal);
  13. % 在原图上画出对角线
  14. [row, col] = size(grayImg);
  15. for i = 1:min(row, col)
  16.     grayImg(i, i) = 255;
  17. end
  18. % 在原图上标出最大值坐标
  19. grayImg(maxIndex, maxIndex) = 0;
  20. grayImg(maxIndex-1:maxIndex+1, maxIndex-1:maxIndex+1) = 0;
  21. % 计算6x6灰度均值并弹框显示
  22. subImg = grayImg(maxIndex-2:maxIndex+3, maxIndex-2:maxIndex+3);
  23. meanValue = mean(subImg(:));
  24. msgbox(sprintf('The mean value of 6x6 region centered at (%d,%d) is %.2f', maxIndex, maxIndex, meanValue));
  25. % 显示结果
  26. imshow(grayImg);
复制代码

请将程序保存为`diagonal_grayscale.m`,并将要处理的图片命名为`image.bmp`,放在同一文件夹下。如果还有其他问题或者错误,请告诉我。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

匿名  发表于 2023-4-19 17:22:56
机器人Gpt 发表于 2023-4-19 17:12
这个错误通常出现在输入的图像不是RGB格式,或者RGB数据有误。因此,我们可以尝试使用imread函数读取图片 ...

图片是1024✖️1280的矩阵,改为斜对角线
回复 支持 反对

使用道具 举报

机器人Gpt 发表于 2023-4-19 17:23:36 | 显示全部楼层
鹿茸 发表于 2023-04-19 17:22
图片是1024✖️1280的矩阵,改为斜对角线 ...

好的,以下是修改后的程序代码,已经将对角线改为斜对角线:clc;clear;% 读入图片并转成灰度图像img = imread('image.bmp');if size(img, 3) == 3    grayImg = rgb2gray(img);else    grayImg = img;end% 提取斜对角线像素值并找到最大值及其坐标[row, col] = size(grayImg);slope = row/col;for ii = 1:row    jj = ceil(slope*ii);    if jj <= col        diagonal(ii) = grayImg(ii, jj);    else        diagonal(ii) = 0;    endend% 找到最大值及其坐标以及计算6x6灰度均值中心坐标[maxValue, maxIndex] = max(diagonal);rowIndex = floor((maxIndex - 1) / row) + 1;colIndex = mod(maxIndex - 1, row) + 1;centerRow = round((rowIndex * slope + colIndex)/(slope + 1));centerCol = round(centerRow/slope);% 在原图上画出斜对角线并标出最大值grayImg = insertShape(grayImg, 'Line', [1 1 centerCol centerRow], 'Color', 'white', 'LineWidth', 2);grayImg = insertText(grayImg, [centerCol-25, centerRow+25], num2str(maxValue), 'FontSize', 16, 'TextColor', 'white');% 计算6x6灰度均值并弹框显示subImg = grayImg(centerRow-2:centerRow+3, centerCol-2:centerCol+3);meanValue = mean(subImg();msgbox(sprintf('The mean value of 6x6 region centered at (%d,%d) is %.2f', centerCol, centerRow, meanValue));% 显示结果imshow(grayImg);请将程序保存为`diagonal_grayscale.m`,并将要处理的图片命名为`image.bmp`,放在同一文件夹下。运行程序后,会弹出一个展示提取出斜对角线灰度及标出对应最大值的图片,并弹出一个对话框展示6x6灰度均值及中心坐标。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

匿名  发表于 2023-4-19 17:32:45
匿名者 发表于 2023-4-19 17:22
图片是1024✖️1280的矩阵,改为斜对角线

图片是1024✖️1280,将程序改为提取斜斜对角线灰度
回复 支持 反对

使用道具 举报

机器人Gpt 发表于 2023-4-19 17:33:41 | 显示全部楼层
鹿茸 发表于 2023-04-19 17:32
图片是1024✖️1280,将程序改为提取斜斜对角线灰度 ...

好的,以下是修改后的程序代码,已经将对角线改为斜斜对角线:clc;clear;% 读入图片并转成灰度图像img = imread('image.bmp');if size(img, 3) == 3    grayImg = rgb2gray(img);else    grayImg = img;end% 提取斜斜对角线像素值并找到最大值及其坐标 = size(grayImg);slope1 = row/col;slope2 = -slope1;for ii = 1:row    jj1 = ceil(slope1*ii);    jj2 = floor(slope2*(ii-row)+col);    if (jj1 >= 1) && (jj1 <= col)        diagonal1(ii) = grayImg(ii, jj1);    else        diagonal1(ii) = 0;    end    if (jj2 >=1) && (jj2 <= col)        diagonal2(ii) = grayImg(ii, jj2);    else        diagonal2(ii) = 0;    endenddiagonal = [diagonal1 diagonal2]; = max(diagonal);rowIndex = find(diagonal == maxValue);colIndex = rowIndex - row;% 找到最大值坐标以及计算6x6灰度均值centerRow = round(rowIndex/2);centerCol = round(colIndex/2);% 在原图上画出斜斜对角线并标出最大值[x,y] = meshgrid(1:col, 1:row);mask = (abs((y-slope1*x)-centerRow)<=3) & (abs((-y-slope2*x+col-col*slope2)-centerRow)<=3);grayImg = insertShape(grayImg, 'Line', [1, jj1, row, jj1], 'Color', 'white', 'LineWidth', 2);grayImg = insertShape(grayImg, 'Line', [1, jj2, row, jj2], 'Color', 'white', 'LineWidth', 2);grayImg = insertText(grayImg, [colIndex, rowIndex], num2str(maxValue), 'FontSize', 16, 'TextColor', 'white');% 计算6x6灰度均值并弹框显示subImg = grayImg(centerRow-2:centerRow+3, centerCol-2:centerCol+3);meanValue = mean(subImg();msgbox(sprintf('The mean value of 6x6 region centered at (%d,%d) is %.2f', centerCol, centerRow, meanValue));% 显示结果imshow(grayImg);请将程序保存为`diagonal_grayscale.m`,并将要处理的图片命名为`image.bmp`,放在同一文件夹下。运行程序后,会弹出一个展示提取出斜斜对角线灰度及标出对应最大值的图片,并弹出一个对话框展示6x6灰度均值及中心坐标。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

匿名  发表于 2023-4-19 17:34:32
机器人Gpt 发表于 2023-4-19 17:23
好的,以下是修改后的程序代码,已经将对角线改为斜对角线:clc;clear;% 读入图片并转成灰度图像img = im ...

调试程序警告: 图像太大,无法在屏幕上显示;将以 67% 显示
> In images.internal.initSize (line 71)
  In imshow (line 309)
     if jj <= col        
               ↑
错误: 等号左侧的表达式不是用于赋值的有效目标。
回复 支持 反对

使用道具 举报

机器人Gpt 发表于 2023-4-19 17:35:15 | 显示全部楼层
鹿茸 发表于 2023-04-19 17:34
调试程序警告: 图像太大,无法在屏幕上显示;将以 67% ...

抱歉,这是我疏忽了。修改后的程序已经修复了这个问题,代码如下:
  1. clc;
  2. clear;
  3. % 读入图片并转成灰度图像
  4. img = imread('image.bmp');
  5. if size(img, 3) == 3
  6.     grayImg = rgb2gray(img);
  7. else
  8.     grayImg = img;
  9. end
  10. % 提取斜对角线像素值并找到最大值及其坐标
  11. [row, col] = size(grayImg);
  12. slope = row/col;
  13. for ii = 1:row
  14.     jj = ceil(slope*ii);
  15.     if jj <= col
  16.         diagonal(ii) = grayImg(ii, jj);
  17.     else
  18.         diagonal(ii) = 0;
  19.     end
  20. end
  21. [maxValue, maxIndex] = max(diagonal);
  22. % 找到最大值及其坐标以及计算6x6灰度均值中心坐标
  23. rowIndex = floor((maxIndex - 1) / row) + 1;
  24. colIndex = mod(maxIndex - 1, row) + 1;
  25. centerRow = round((rowIndex * slope + colIndex)/(slope + 1));
  26. centerCol = round(centerRow/slope);
  27. % 在原图上画出斜对角线并标出最大值
  28. xStart = 1;
  29. yStart = round(slope*(xStart-1)+1);
  30. xEnd = row;
  31. yEnd = round(slope*(xEnd-1)+1);
  32. grayImg = insertShape(grayImg, 'Line', [yStart, xStart, yEnd, xEnd], 'Color', 'white', 'LineWidth', 2);
  33. grayImg = insertText(grayImg, [yEnd, xEnd], num2str(maxValue), 'FontSize', 16, 'TextColor', 'white');
  34. % 计算6x6灰度均值并弹框显示
  35. subImg = grayImg(centerRow-2:centerRow+3, centerCol-2:centerCol+3);
  36. meanValue = mean(subImg(:));
  37. msgbox(sprintf('The mean value of 6x6 region centered at (%d,%d) is %.2f', centerCol, centerRow, meanValue));
  38. % 显示结果
  39. figure;
  40. imshow(grayImg);
复制代码

请再次运行程序并查看是否仍然有问题。
--- 光学专家Gpt
回复 支持 反对

使用道具 举报

12下一页
发帖

快速回帖

您需要登录后才可以回帖 登录 | 立即注册 手机动态码快速登录

本版积分规则

关于楼主

匿名用户组
  • 主题

    125
  • 回答

    44
  • 积分

    129
联系客服 关注微信 访问手机版 返回顶部 返回列表