【问题标题】:How can thin horizontal lines be added between each row in a grayscale image?如何在灰度图像的每一行之间添加细水平线?
【发布时间】:2013-08-04 23:31:29
【问题描述】:

我需要创建一个 n 阶 Hadamard 矩阵,将其加倍,在每行内随机排列矩阵的元素,然后显示它。到目前为止,我已经完成了所有这些事情。当我imshow(matrix) 时,我最终得到的是一张黑白盒子的漂亮图片。 但我还没有弄清楚如何插入细线来划分每一行。我可以创建类似于左侧第一张图像的图像,但不能创建右侧图像(这些是图 1 和2 来自this paper)

 

任何帮助或 cmets 将不胜感激。

【问题讨论】:

    标签: matlab image-processing matrix


    【解决方案1】:

    我发现使用向量方法(例如,patchrectangle)来解决这类问题不必要地具有挑战性。我认为建立一个新形象更直接。这避免了浮点舍入问题和矢量图形出现的其他问题。我下面的解决方案依赖于图像处理工具箱中的一些功能,但简单快捷:

    % Create data similarly to @TryHard
    H = hadamard(48);
    C = (1+[H;-H])/2;
    rng(0); % Set seed
    C(:) = C(randperm(numel(C))); % For demo, just permute all values, not rows
    
    % Scale image and lines
    scl = 10; % Amount to vertically scale each row
    pad = 2;  % Number of pixels to add between each row
    C = imresize(C,scl,'nearest');
    C = blockproc(C,[scl size(C,2)],@(x)[x.data;zeros(pad,size(C,2))]);
    C = C(1:end-pad,:); % Remove last line added
    
    % Dispay image
    imshow(C)
    

    这会产生这样的图像

               

    sclpad 参数可以轻松调整以获得不同的大小和相对大小。如果需要,您可以在添加线条后再次调用imresize(...,'nearest') 以进一步缩放图像。 blocproc 行可以通过各种选项提高效率(请参阅帮助)。它也可以通过调用im2colcol2im 来代替,这可能会更快,如果更混乱的话。

    【讨论】:

    • 哇,你让它看起来如此简单!您甚至缩短了行倍增过程。感谢您的回复和洞察力,这对您有很大帮助!
    • @StrugglingGradStudent:你需要确保我正确地完成了那部分。我真的不知道 Hadamard 矩阵需要什么,我只是想创建一些数据来提供其余代码的演示。很高兴这很有帮助。如果它最终解决了您的问题,请告诉我。
    • @StrugglingGradStudent 如果它符合您的要求,请考虑接受答案
    【解决方案2】:

    我没有尝试代码,但我认为类似的东西应该可以工作:

    sizeOfACube = 6;
    numberOfRows = 47;    
    
    RGB = imread('image.png');
    RGB = imresize(A, [(numRows+numberOfRows) numCols]);
    
    
    for i=1:1:NumberOfRows 
        RGB(i*6,:,:) = 0;
    end
    
    imagesc(RGB);
    imwrite(RGB,'newImage.png');
    

    与: sizeOfAcube 二维码上一个立方体的大小。 numRows 和 numCols 原始图像的行数和列数。

    【讨论】:

    • 谢谢@R。佛手柑。但是,您的代码不起作用,但它给了我一些思考。我真的需要更多地了解 matlab,在上下文中查看各种函数会有所帮助。
    【解决方案3】:

    一种解决方案是使用补丁,例如:

    % set up example array
    xl = 24; yl = xl;
    [X Y] = find(hadamard(xl)==1);
    % generate figure
    figure, hold on
    for ii=1:length(X)
        patch(X(ii) + [0 0 1 1],Y(ii) + [0.1 0.9 0.9 0.1],[1 1 1],'Edgecolor',[1 1 1])
    end
    axis([0 xl+1 0 yl+1])
    axis('square')
    

    patch 命令patch(x,y, color) 接受多边形元素的顶点为xy。在此示例中,您可以修改术语 [0.1 0.9 0.9 0.1] 以设置边界黑线的粗细。

    这会生成

    已编辑

    对于 OP 提供的特定实例:

    H=Hadamard(48); %# now to row-double the matrix 
    A=(1+H)/2;
    B=(1-H)/2;
    C=[A; B]; %# the code below randomly permutes elements within the rows of the matrix 
    [nRows,nCols] = size(C); 
    [junk,idx] = sort(rand(nRows,nCols),2); %# convert column indices into linear indices 
    idx = (idx-1)*nRows + ndgrid(1:nRows,1:nCols); %# rearrange whatever matrix 
    E = C; 
    E(:) = E(idx);
    [X Y] = find(logical(E));
    xl = length(X);
    yl = length(Y);
    figure, hold on
    for ii=1:xl
         rectangle('Position',[X(ii) Y(ii)+.2 1 0.8],'facecolor',[1 1 1],'edgecolor',[1 1 1])
    end
    axis([0 max(X)+1 0 max(Y)+1])
    axis('square')
    set(gca,'color',[0 0 0])
    set(gca,'XTickLabel',[],'YTickLabel',[],'XTick',[],'YTick',[])
    

    此示例使用rectangle 代替补丁来生成尖角。

    图片:

    【讨论】:

    • 感谢您的回复! @Try Hard,您的结果看起来很有希望,但是当我尝试您的代码时,我得到的只是一个空白数字。我已经对其进行了一些操作,并且可以显示框的轮廓,但是由于对 matlab 非常不熟悉,我不确定还有什么需要修改的。我当前生成矩阵的代码如下评论中...
    • H=Hadamard(48) %# 现在对矩阵 A=(1+H)/2 B=(1-H)/2 C=[A; B] %# 下面的代码随机排列矩阵行中的元素 [nRows,nCols] = size(C); [~,idx] = sort(rand(nRows,nCols),2); %# 将列索引转换为线性索引 idx = (idx-1)*nRows + ndgrid(1:nRows,1:nCols); %# 重新排列任意矩阵 E = C; E(:) = E(idx) imshow(E)
    • 感谢您的回复。使用您的代码,我可以复制您发布的图像。我有两个担忧,许多黑白方块都有圆角,有些则没有。我不确定这是为什么。对于我的应用程序,我需要确保只有直角和明确的角。我的第二个担心是整个矩阵/图像现在有两倍多的列(96 而不是 48)。再次衷心感谢您对@Try Hard 的所有帮助!
    • 当然,我需要确保我可以将代码用于任何阶 Hadamard 矩阵,因此 N=48 没有什么特别之处。
    • 关于圆角:我也看到了,会研究一下,或者你可以将它作为一个单独的问题发布(我没有在网上搜索答案,可能有人之前已经注意到了)
    猜你喜欢
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多