Как сравнить два изображения и выделить разницу? - PullRequest
0 голосов
/ 09 апреля 2019

В моем приложении мне нужно сравнить 2 изображения и выделить разницу цветом. Например, я сравниваю UIImage1 с UIImage2, где оба изображения одинаковы, за исключением небольшого квадрата в UIImage2. Мне нужно выделить дополнительный квадратный объект красным цветом и отобразить его в виде изображения, в противном случае я хочу узнать направление разницы по осям x и y.

Я пробовал этот код ниже. в этом коде я могу изменить только альфа-значение разницы. невозможно изменить цвет различий.

UIImage* bottomImage = [UIImage imageNamed:@"j1.jpg"];
UIImage* topImage    = [UIImage imageNamed:@"j2.jpg"];
UIImageView* imageView = [[UIImageView alloc] initWithImage:bottomImage];
UIImageView* subView   = [[UIImageView alloc] initWithImage:topImage];
subView.alpha = 0.5;  // Customize the opacity of the top image.
[imageView addSubview:subView];
UIGraphicsBeginImageContext(imageView.frame.size);
[imageView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage* blendedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
_imageview.image = blendedImage;

изображение 1:

enter image description here

изображение 2:

enter image description here

разное изображение:

enter image description here

но я хочу вот что:

enter image description here

Я новичок в OpenCV, коды написаны на python. Может ли кто-нибудь помочь мне изменить этот код в цель-с? Я пытался, но получаю только ошибку.

https://stackoverflow.com/a/27500479/6859041

im = cv2.imread('c:\\diff.jpg')
im1 = cv2.imread('c:\\Edited.jpg')


imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,0)
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

cv2.drawContours(im1, contours, -1, (0,255,0), 1)
cv2.imwrite("c:\\see_this.jpg", im1)

как изменить этот код на цель C?

спасибо.

Ответы [ 3 ]

0 голосов
/ 10 апреля 2019

Вы можете непосредственно просмотреть данные основы изображения, чтобы получить значение RGBA для любого пикселя, а затем использовать их для сравнения или построения нового изображения.Хотя это дорого делать на процессоре.Вы можете найти гораздо быстрее написать собственный шейдер графического процессора, который jsut сравнивает два входа и записывает вывод в зависимости от того, равны они или нет.

func pixel(in image: UIImage, at point: CGPoint) -> (UInt8, UInt8, UInt8, UInt8)? {
    let width = Int(image.size.width)
    let height = Int(image.size.height)
    let x = Int(point.x)
    let y = Int(point.y)
    guard x < width && y < height else {
        return nil
    }
    guard let cfData:CFData = image.cgImage?.dataProvider?.data, let pointer = CFDataGetBytePtr(cfData) else {
        return nil
    }
    let bytesPerPixel = 4
    let offset = (x + y * width) * bytesPerPixel
    return (pointer[offset], pointer[offset + 1], pointer[offset + 2], pointer[offset + 3])
}

let image = UIImage(named: "t.png")!
if let (r,g,b,a) = pixel(in: image, at: CGPoint(x: 1, y:2)) {
    print ("Red: \(r), Green: \(g), Blue: \(b), Alpha: \(a)")
}
0 голосов
/ 11 апреля 2019

С ImageMagick это довольно просто.

img1.jpg enter image description here

img2.jpg enter image description here

compare -fuzz 25% -metric rmse -lowlight-color transparent -highlight-color red img1.jpg img2.jpg diffimage.jpg
1562.23 (0.0238381)


enter image description here

Вы можете сделать то же самое в Python Wand, который вызывает ImageMagick и получает то же изображение и значение, что и выше. (Кредиты emcconville)

#!/bin/python3.7
from wand.image import Image
from wand.display import display
from wand.api import library

with Image(filename='img1.jpg') as bimg:
    with Image(filename='img2.jpg') as fimg:
        # We have to call the C method directly, and calculate the percentage.
        library.MagickSetImageFuzz(bimg.wand, 0.25 * bimg.quantum_range)
        bimg.artifacts['compare:highlight-color'] = 'red'
        bimg.artifacts['compare:lowlight-color'] = 'transparent'
        diff_img, diff_val =  bimg.compare(fimg, 'root_mean_square')
        print(diff_val)
        with diff_img:
            diff_img.save(filename='img1_img2_diff.jpg')
0 голосов
/ 09 апреля 2019

Вы можете проверить код решения Facebook для тестирования под названием Снимок: https://github.com/uber/ios-snapshot-test-case/

Посмотрите на папку категорий.

- (UIImage *)fb_diffWithImage:(UIImage *)image
{
    if (!image) {
        return nil;
    }
    CGSize imageSize = CGSizeMake(MAX(self.size.width, image.size.width), MAX(self.size.height, image.size.height));
    UIGraphicsBeginImageContextWithOptions(imageSize, YES, 0);
    CGContextRef context = UIGraphicsGetCurrentContext();
    [self drawInRect:CGRectMake(0, 0, self.size.width, self.size.height)];
    CGContextSetAlpha(context, 0.5);
    CGContextBeginTransparencyLayer(context, NULL);
    [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];
    CGContextSetBlendMode(context, kCGBlendModeDifference);
    CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
    CGContextFillRect(context, CGRectMake(0, 0, self.size.width, self.size.height));
    CGContextEndTransparencyLayer(context);
    UIImage *returnImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return returnImage;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...