【问题标题】:how to find the black region in near the edge如何找到边缘附近的黑色区域
【发布时间】:2016-11-30 01:21:55
【问题描述】:

我有一张像下面这样的图片。它在图像的顶部和右侧有黑色边框/区域。我希望能够找到这些区域,如第二张图片所示。请注意,这些区域应始终是直的(即矩形)。我希望能够使用“使用不使用 photoshop 的代码进行图像处理”(例如 matlab、c# 或 opencv)来做到这一点。

我对“图像处理”非常陌生。我试图找到所有具有 (0,0,0) rgb 值的点。但是因为在噪声部分(以及图像中的任何其他地方)中有很多这样的黑色值。我的结果区域也包含这些不需要的区域....

--------- 编辑 --------------- 感谢所有 cmets/答案。但是,我有很多这样的图像。其中一些是旋转的,这有点难以处理。我刚刚上传了一张,如下图。

【问题讨论】:

  • 请展示你的尝试。
  • @JulienBernu 刚刚编辑了我的帖子
  • 只选择所有点都为0的行/列。

标签: python matlab opencv image-processing


【解决方案1】:
color_img = imread('0k4Kh.jpg');
img = rgb2gray(color_img);
[x, y] = size(img);

for i = 1:x
    if length(find(img(i, :))) ~= 0
        lastmarginalrow = i-1;
        break;
    end
end

for ii = y:-1:1
    if length(find(img(:, ii))) ~= 0
        lastmarginalcol = ii-1;
        break;
    end
end

figure;
fig = imshow(color_img);
h = impoly(gca, [0,x; lastmarginalcol,x; lastmarginalcol,lastmarginalrow; 0,lastmarginalrow]);
api = iptgetapi(h);
api.setColor('red');
saveas(fig, 'test.jpg');
close all;

这是 MATLAB 中的实现。找到 zeros 列和 zeros 行并使用它们绘制边框。

适用于旋转图像(也适用于非旋转图像)

color_img = imread('N6vK9.png');
img = rgb2gray(color_img);
[x, y] = size(img);

verts = [];
% traversing through all columns
for i = 1:y
    % find all non-zero pixels in each column
    nonzeros = find(img(:,i));
    % if all pixels are black in a column, below if condition will skip
    if length(nonzeros) ~= 0
        % if there is atleast one non-zero pixel, not that co-oridinate/positions in matrix by appending
        verts = [i, nonzeros(1); verts];
    end
end

figure;
fig = imshow(color_img);
% polygon based on first and last vertix/co-ordinate of found non-zero co-ordinates
% Assumed that it was slanted straight line, used last and first co-ordinate. If it is curvy border, anyways we have all veritices/co-ordinates of first non-zero pixel in all columns.
h = impoly(gca, [verts(1,:); verts(length(verts), :); 1,x; verts(1),x]);
api = iptgetapi(h);
api.setColor('red');
saveas(fig, 'test.jpg');
close all;

【讨论】:

  • 感谢您的回答。 SauravGupta 也给出了类似的答案来找到非零列/行。就像我上面对他的回答一样,我已经旋转了图像。你有解决办法吗?
  • 这可以通过min (logical (sum (img, 2)) .* [1 : size (img, 1)]' ) 等操作轻松矢量化。问题是我们正在做出很多假设这些黑色区域“在哪里”、“有多少”等。我我确定特别适用于该图像的内容不适用于 OP 集中的所有图像。
  • @TasosPapastylianou 感谢 cmets。我不明白“矢量化”是什么意思。但基本上我的图像可以归类为上述两组(旋转,不旋转)。旋转的可以有不同的角度(PS:我不知道角度)。
  • @wildcolor 也为旋转图像添加了解决方案
  • @be_good_do_good 感谢您的精彩回答。你能解释一下吗?
【解决方案2】:

使用 Python2.7 + OpenCV3。这个想法是只保留非零的行和列。代码如下。

import cv2
import numpy as np
#Read in the image
arr = np.array(cv2.imread('image.jpg'))
#Convert to grayscale
gray = np.sum(arr, axis=2)
print gray.shape #(496, 1536)
filter_row = np.sum(gray,axis=1)!=0
# Assuming first few values are all False, find index of first True, and set all values True after that 
filter_row[list(filter_row).index(True):,] = True
# Keep only non-zero rows
horiz = gray[filter_row,:]

filter_column = np.sum(gray,axis=0)!=0
# Assuming first few values are all False, find index of first False, and set all values True before that 
filter_column[:list(filter_column).index(False),] = True
# Keep only non-zero columns
vert = horiz[:,filter_column]
print vert.shape #(472, 1528)
bordered = cv2.rectangle(cv2.imread('image.jpg'), (0, gray.shape[0]-vert.shape[0]), (vert.shape[1],gray.shape[0] ), (255,0,0), 2)
cv2.imwrite(bordered,'result.jpg')

【讨论】:

  • 严格来说,这不是正确的答案,因为如果它们碰巧没有斑点,它也会删除图像“内”的行/列。
  • 我同意。但我检查了np.sum(gray,axis=1)!=0 数组,所有False 值都位于数组的顶部。同样对于np.sum(gray,axis=1)!=0 Lemme 修改代码以确保只省略从顶部/右侧开始的连续行/卷。
  • @TasosPapastylianou 已修复。
  • @SauravGupta 感谢您的回答。我一看到你的第一句话就让我大吃一惊。
  • ps:@TasosPapastylianou 所说的也可能是真的。这不是我拥有的唯一图像。我有很多这样的图片。
猜你喜欢
  • 2016-02-07
  • 2016-12-10
  • 1970-01-01
  • 2018-06-06
  • 2015-11-26
  • 2020-01-03
  • 2015-04-25
  • 2021-09-16
  • 1970-01-01
相关资源
最近更新 更多