Гауссовское размытие с помощью OpenCV: только размытие субрегиона изображения?
Можно ли размывать только субрегион изображения вместо всего изображения с помощью OpenCV, чтобы сэкономить некоторые вычислительные затраты?
РЕДАКТИРОВАТЬ: Одним из важных моментов является то, что при размытии границы субрегиона, следует максимально использовать существующее содержимое изображения; только когда свертка выходит за границы исходного изображения, можно использовать экстраполяцию или другие условия искусственной границы.
Ответы
Ответ 1
Чтобы размыть все изображение, если вы хотите перезаписать оригинал (фильтрация на месте поддерживается cv:: GaussianBlur), у вас будет что-то вроде
cv::GaussianBlur(image, image, Size(0, 0), 4);
Чтобы размыть только регион, используйте Mat:: operator() (const Rect & roi), чтобы извлечь область:
cv::Rect region(x, y, w, h);
cv::GaussianBlur(image(region), image(region), Size(0, 0), 4);
Или если вы хотите размытый вывод в отдельном изображении:
cv::Rect region(x, y, w, h);
cv::Mat blurred_region;
cv::GaussianBlur(image(region), blurred_region, Size(0, 0), 4);
В приведенном выше примере используется параметр BORDER_CONSTANT
по умолчанию, который предполагает, что все за пределами изображения равно 0 при выполнении размытия.
Я не уверен, что он делает с пикселями на краю области. Вы можете заставить его игнорировать пиксели вне региона (BORDER_CONSTANT | BORDER_ISOLATE). Так что, похоже, он использует пиксели вне региона. Вам нужно сравнить результаты, приведенные выше:
const int bsize = 10;
cv::Rect region(x, y, w, h);
cv::Rect padded_region(x - bsize, y - bsize, w + 2 * bsize, h + 2 * bsize)
cv::Mat blurred_padded_region;
cv::GaussianBlur(image(padded_region), blurred_padded_region, Size(0, 0), 4);
cv::Mat blurred_region = blurred_padded_region(cv::Rect(bsize, bsize, w, h));
// and you can then copy that back into the original image if you want:
blurred_region.copyTo(image(region));
Ответ 2
Да, можно размыть регион интереса к OpenCV.
size( 120, 160 );
OpenCV opencv = new OpenCV(this);
opencv.loadImage("myPicture.jpg");
opencv.ROI( 60, 0, 60, 160 );
opencv.blur( OpenCV.BLUR, 13 );
image( opencv.image(), 0, 0 );
Для получения дополнительной информации ознакомьтесь с ссылкой.
Удачи,
Ответ 3
Вот как это сделать в Python. Идея состоит в том, чтобы выбрать ROI, размыть его, а затем вставить его обратно в изображение
import cv2
# Read in image
image = cv2.imread('1.png')
# Create ROI coordinates
topLeft = (60, 140)
bottomRight = (340, 250)
x, y = topLeft[0], topLeft[1]
w, h = bottomRight[0] - topLeft[0], bottomRight[1] - topLeft[1]
# Grab ROI with Numpy slicing and blur
ROI = image[y:y+h, x:x+w]
blur = cv2.GaussianBlur(ROI, (51,51), 0)
# Insert ROI back into image
image[y:y+h, x:x+w] = blur
cv2.imshow('blur', blur)
cv2.imshow('image', image)
cv2.waitKey()
До ->
После
![]()
Ответ 4
Если вы используете javacv, предоставленный bytecode
тогда вы можете сделать так Это только размывает определенную рентабельность инвестиций.
Mat src = imread("xyz.jpg",IMREAD_COLOR);
Rect rect = new Rect(50,50,src.size().width()/3,100);
GaussianBlur(new Mat(src, rect), new Mat(src, rect), new Size(23,23), 30);
Ответ 5
Вы можете размыть все изображение и заменить область, которую вы не хотите размыть, от исходного изображения