【问题标题】:Matlab- Improve code in image cropping black borderMatlab-改进图像裁剪黑色边框的代码
【发布时间】:2014-10-24 09:56:48
【问题描述】:

我有这段代码可以裁剪图片中的黑色边框。

我不知道为什么边界仍然存在。

I1=im2double(imread('dart.jpg'));

sizeI = size(I1);
zeros = floor((sizeI(2) -  min(sum(any(I1))))/2);
I2 = I1(:, zeros : sizeI(2)-zeros, :);
nonZero = sum(any(I1,2));


sizeI2 = size(I2);
zerosRows = floor((sizeI(1) -  min(sum(any(I2, 2))))/2);
I3 = I2(zerosRows : sizeI2(1)-zerosRows, :, :);

subplot(1,3,1), imshow(I1);title('Figure 1');
subplot(1,3,2), imshow(I2);title('Figure 2');
subplot(1,3,3), imshow(I3);title('Figure 3');

如何更改此代码?

【问题讨论】:

    标签: image matlab image-processing matlab-guide


    【解决方案1】:

    此代码适用于我,假设您的黑色边框像素全为零。如果图像的黑色边框中有非零像素(可能是由于量化和压缩伪影 - 毕竟您的图像是 JPEG ......),那么此代码将不起作用。这段代码所做的是首先检查所有列以查看是否有任何非零像素。然后,它通过确定第一个非零列并转到最后一个非零列来确定要裁剪的位置。此代码还假定非零列是对称,这就是您在zeros 语句中除以2 的原因。顺便说一句,zeros 是 MATLAB 中的内置函数。我不建议您创建具有此名称的变量,因为您以后的代码可能需要此函数,并且您无意中使用变量掩盖了此函数。

    尽管如此,我还是通过以下方式测试您的代码是否有效。我使用了来自 MATLAB 系统路径 cameraman.tif 的内置图像,并在图像周围创建了一个 10 像素的边框。然后我运行你的代码,看看我会得到什么:

    im = imread('cameraman.tif');
    I1 = padarray(im2double(im), [10 10]);
    

    运行你的代码,这是我得到的图:


    运行该代码时存在某些先决条件,因此在使用它之前请记住这一点:

    1. 这假定图像周围有一个完全对称的黑色边框。
    2. 这假设所有黑色边框像素都是
    3. 如果您的边框有非零像素,即使它可能在视觉上看起来像有非零像素,那么此代码将不起作用。

    因此,我建议您将图像阈值设置为少量(也许强度为 10),以确保在继续之前边界为零。然后,您将使用此图像来计算您有多少边框像素。因此,请执行以下操作。

    I1=im2double(imread('dart.jpg')); %// Read in the image
    I1thresh = I1 >= (10/255); %// As an example - Note the division by 255 as you did im2double
    sizeI = size(I1);
    zeros = floor((sizeI(2) -  min(sum(any(I1thresh))))/2); %// Note the change in any
    I2 = I1(:, zeros : sizeI(2)-zeros, :); 
    I2thresh = I1thresh(:, zeros : sizeI(2)-zeros, :);  % // Note new variable
    nonZero = sum(any(I1thresh,2)); %// Note the change in any
    
    sizeI2 = size(I2);
    zerosRows = floor((sizeI(1) -  min(sum(any(I2thresh, 2))))/2); %// Note change in any
    I3 = I2(zerosRows : sizeI2(1)-zerosRows, :, :);
    
    subplot(1,3,1), imshow(I1);title('Figure 1');
    subplot(1,3,2), imshow(I2);title('Figure 2');
    subplot(1,3,3), imshow(I3);title('Figure 3');
    

    编辑 - 不均匀的黑色边框

    从您的 cmets 中,您说您的黑色边框可能不是对称的。在这种情况下,您需要有逻辑来确定黑色边框的开始位置到黑色边框的结束位置。您将其应用于黑色边框的行和列。在这种情况下,我将使用find 命令,并沿行和列使用any 操作,并确定行和列不为零的最小和最大索引。这正好对应于 MATLAB 中关于您的代码的最小和最大操作。我将使用带有阈值的修改后的算法来规避任何量化或压缩伪影。因此:

    I1=im2double(imread('dart.jpg')); %// Read in the image
    I1thresh = I1 >= (10/255); %// As an example - Note the division by 255 as you did im2double
    %// Removed as this is no longer needed 
    %// sizeI = size(I1);
    nonZeroCols = find(any(I1thresh)); %// Change
    minCol = min(nonZeroCols); %// Change
    maxCol = max(nonZeroCols); %// Change
    I2 = I1(:, minCol : maxCol, :); 
    I2thresh = I1thresh(:, minCol : maxCol, :);  % // Note new variable
    %// Commented out. Don't see this being used anywhere
    %//nonZero = sum(any(I1thresh,2)); %// Note the change in any
    
    %// Removed as this is no longer needed
    %//sizeI2 = size(I2);
    nonZeroRows = find(any(I2thresh, 2)); %// Change
    minRow = min(nonZeroRows); %// Change
    maxRow = max(nonZeroRows); %// Change
    I3 = I2(minRow : maxRow, :, :); %// Change
    
    subplot(1,3,1), imshow(I1);title('Figure 1');
    subplot(1,3,2), imshow(I2);title('Figure 2');
    subplot(1,3,3), imshow(I3);title('Figure 3');
    

    上面的代码现在应该适用于任何大小的黑色边框。

    【讨论】:

    • 亲爱的朋友 :) 我知道这段代码是做什么的.. 我认为问题在于我的图片中的黑色边框不对称我该如何改变它
    • @SEBASTIANLOTuS - 您需要更多帮助吗?
    • 请问,如何更新此代码以将其应用于我的边框内容非零像素
    • @zenab - 我不知道你刚刚说了什么。请澄清。
    • @rayryeng- 我想通知你我的图像边框不是黑色的,我想说你的代码在我的 rgb 博物馆图像上效果不佳,即它没有删除图像边框..谢谢
    猜你喜欢
    • 2020-03-20
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多