我很想知道如何为图像着色(例如,制作白色.png红色).我已经看到了各种建议,但从未确认这实际上是可行的.我试过这个:
-(UIImage *)colorizeImage:(UIImage *)baseImage color:(UIColor *)theColor {
UIGraphicsBeginImageContext(baseImage.size);
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGRect area = CGRectMake(0, 0, baseImage.size.width, baseImage.size.height);
CGContextScaleCTM(ctx, 1, -1);
CGContextTranslateCTM(ctx, 0, -area.size.height);
CGContextSaveGState(ctx);
CGContextClipToMask(ctx, area, baseImage.CGImage);
[theColor set];
CGContextFillRect(ctx, area);
CGContextRestoreGState(ctx);
CGContextSetBlendMode(ctx, kCGBlendModeNormal);
CGContextDrawImage(ctx, area, baseImage.CGImage);
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}
myImageView.image = [self colorizeImage:[UIImage imageNamed:@"whiteImage.png"] color:[UIColor redColor]];
Run Code Online (Sandbox Code Playgroud)
但它不起作用 - 屏幕上的图像仍然是白色的.
我正在努力用用户选择的颜色替换图像中的某些颜色.我正在使用OpenCV进行颜色替换.
总之,我已经描述了从哪里获得帮助以及我得到了什么.
如何更改图像中的特定颜色? 我已经按照上面的链接回答了步骤或采取了基本的想法.在那个链接的正确答案中,那个人告诉你只需要改变色调来替换颜色.
在那之后我遇到类似像iphone应用程序的图像中的颜色替换的问题
(即,这是完全初学者的颜色替换的好代码)
从那个问题我得到了我还需要改变"饱和度"的想法.
现在我遇到了类似的问题
"当我的源图像太亮(即高亮度)并且我用一些深色替换颜色时,颜色在替换图像中看起来很亮而不是暗,因为看起来替换颜色与使用我们完成的颜色不匹配替换"
这是因为我没有考虑更换亮度.在这里,我被困在改变亮度的公式或想法是什么?
假设我用目标颜色的亮度替换图像的亮度然后看起来像平坦的替换物,图像将失去它的实际阴影或边缘.
编辑:
当我在更换时考虑光源的亮度(即要处理的像素)时,我面临一个问题.让我按照我的应用场景解释一下.
例如我正在改变汽车的颜色(如whiteAngl解释)之后,我正在擦除新颜色汽车的一小部分.我再次对擦除的部分进行重新着色,但现在发生的事情是擦除后的颜色和擦除之前的颜色不匹配,因为两次我都得到不同的亮度,因为我的处理像素都被改变了,并且由于它的亮度颜色在输出中改变了.如何克服这个问题
任何帮助将不胜感激

基本上我想为我的涂料应用实现颜色替换功能.以下是原始和预期的输出
原版的:

更改用户选择的墙面颜色以及一些更换阈值后
我尝试了两种方法,但无法按预期工作
方法1:
基于队列的洪水填充算法用于颜色替换,但是我得到的输出低于非常缓慢的墙壁阴影并且没有保留.

方法2: 所以我试着看另一个选项,发现下面的帖子来自SO 如何更改图像中的特定颜色?
但我无法理解逻辑,也不确定我在第3步中的代码实现.
根据我的理解,请在每个步骤中找到以下代码.
1)使用cvCvtColor将图像从RGB转换为HSV(我们只想更改色调).
IplImage *mainImage=[self CreateIplImageFromUIImage:[UIImage imageNamed:@"original.jpg"]];
IplImage *hsvImage = cvCreateImage(cvGetSize(mainImage), IPL_DEPTH_8U, 3);
IplImage *threshImage = cvCreateImage(cvGetSize(mainImage), IPL_DEPTH_8U, 3);
cvCvtColor(mainImage,hsvImage,CV_RGB2HSV);
Run Code Online (Sandbox Code Playgroud)
2)使用cvThreshold隔离颜色,指定一定的容差(您想要一系列颜色,而不是一种颜色).
cvThreshold(hsvImage, threshImage, 0, 100, CV_THRESH_BINARY);
Run Code Online (Sandbox Code Playgroud)
3)使用blob检测库(如cvBlobsLib)丢弃低于最小大小的颜色区域.这将消除场景中相似颜色的点.我是否需要指定原始图像或背景图像?
CBlobResult blobs = CBlobResult(threshImage, NULL, 0);
blobs.Filter( blobs, B_EXCLUDE, CBlobGetArea(), B_LESS, 10);
Run Code Online (Sandbox Code Playgroud)
4)使用cvInRangeS掩盖颜色并使用生成的蒙版应用新色调.
不确定这个函数它如何帮助更换颜色并且无法理解要提供的参数.
5)cv使用新色调对新图像进行处理,图像由在第一步中保存的饱和度和亮度通道组成.
据我所知,cvMerge将合并HS和V的三个通道,但我如何使用上述三个步骤的输出.
所以基本上坚持使用opencv实现,
如果可能的话请指导我进行opencv实现或任何其他试用的解决方案.
我正在做一个iPhone绘画应用程序.我想使用touchevent绘制图像的特定部分以找到像素数据,然后使用该像素数据绘制图像的剩余部分.使用touchevent,我得到了该部分的像素值:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
startPoint = [[touches anyObject] locationInView:imageView];
NSLog(@"the value of the index is %i",index);
NSString* imageName=[NSString stringWithFormat:@"roof%i", index];
tempColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:imageName]];
lastPoint = [touch locationInView:self.view];
lastPoint.y -= 20;
NSString *tx = [[NSString alloc]initWithFormat:@"%.0f", lastPoint.x];
NSString *ty = [[NSString alloc]initWithFormat:@"%.0f", lastPoint.y];
NSLog(@"the vale of the string is %@ and %@",tx,ty);
int ix=[tx intValue];
int iy=[ty intValue];
int z=1;
NSLog(@"the vale of the string is %i and %i and …Run Code Online (Sandbox Code Playgroud) 我试图让CIColorCube过滤器工作.但是,Apple文档仅提供了一个解释不佳的参考示例:
// Allocate memory
const unsigned int size = 64;
float *cubeData = (float *)malloc (size * size * size * sizeof (float) * 4);
float rgb[3], hsv[3], *c = cubeData;
// Populate cube with a simple gradient going from 0 to 1
for (int z = 0; z < size; z++){
rgb[2] = ((double)z)/(size-1); // Blue value
for (int y = 0; y < size; y++){
rgb[1] = ((double)y)/(size-1); // Green value
for (int x = 0; x < …Run Code Online (Sandbox Code Playgroud)