2012-01-30 41 views
8

Tôi đang phát triển một ứng dụng iOS, trong đó người dùng có thể thay đổi một phần của màu sắc của hình ảnh, nói một tách trà, bằng cách chạm vào nó. Tôi đang sử dụng thuật toán Floodfill để tô màu để người dùng phải chạm vào Chén Trà để thay đổi màu của nó. Đó là làm việc tốt. Nhưng, màu cuối cùng trông hơi khác so với màu thay thế. Tôi có một số vấn đề tìm ra một logic tốt hơn để chuyển đổi màu sắc của đối tượng (Tea Cup) thành màu đã chọn xem xét độ bão hòa của nó & nhẹ nhàng.Logic/thuật toán màu hình ảnh tốt hơn

Tôi đang sử dụng logic sau để có được màu kết quả. Tôi đại diện cho màu là (màu sắc, độ bão hòa, giá trị).

touchedColor = (tchd_h, tchd_s, tchd_v); // I am not using this now 

pixelColor = (old_h, old_s, old_v); 
replacementColor = (new_h, new_s, new_v); 
resultColor = (new_h, new_s, old_v); 
pixelColor = resultColor; 

Cốc trước khi sơn (khoanh tròn bằng màu đỏ).

enter image description here

Các replacementColor chọn.

enter image description here

Cup sau khi sơn replacementColor (vòng tròn màu đỏ).

enter image description here

Xem hình ảnh cuối cùng ở trên. Như tôi chỉ cần thay đổi chỉ sắc & bão hòa, và không phải là giá trị của pixelColor, màu sắc ứng dụng không trông giống như chọn replacementColor. Độ sáng nhẹ của hình ảnh vẫn không bị thay đổi.

Nếu tôi thay đổi giá trị cùng với sắc & bão hòa như thế này,

resultColor = (new_h, new_s, new_v); 
pixelColor = resultColor; 

Sau đó, chiếc cốc trở nên bằng phẳng màu, thiếu đèn & màu như thế này,

enter image description here

Tôi muốn một số ý tưởng để tinh chỉnh logic trên để thay đổi màu pixel thành màu thay thế phù hợp. Có thể có một số công thức để lấy được độ bão hòa & giá trị.

+0

Có thể cho chúng tôi thấy ví dụ về những gì bạn nghĩ là sai? Tôi không thể nhìn thấy một vấn đề với tiền đề cơ bản. –

+0

@Mark Ransom, Có, tôi đã cập nhật câu hỏi của mình với hình ảnh. – EmptyStack

Trả lời

3

Trong ví dụ của bạn, hãy gọi màu hồng là "Màu sắc để thay thế" và hãy gọi màu nâu là "Màu thay thế". Đối với mỗi pixel trong đích, tìm pixel tương ứng trong nguồn. Xem nó thay đổi như thế nào từ "Color to Replace". Bây giờ, hãy thực hiện các điều chỉnh tương tự với "Màu thay thế" và sử dụng màu đó tại điểm ảnh đầu ra hiện tại.Ví dụ: nếu pixel nguồn hiện tại tối hơn màu để thay thế bằng đơn vị 5 "v", thì đặt pixel đầu ra thành màu thay thế được làm tối hơn bằng đơn vị 5 "v". (Và bạn cũng muốn thực hiện các điều chỉnh tương tự về màu sắc và độ bão hòa.)

Có thể bạn sẽ cần giới hạn phạm vi màu bạn điều chỉnh để không chuyển sang các đối tượng khác.

+0

Cảm ơn bạn đã phản hồi. Tôi có thể hiểu những gì bạn đang nói. Tôi không biết làm thế nào để thực hiện nó trong thời gian thực. Bạn có thể chỉ cho tôi một số mã giả hay gì đó không? Tôi đang đấu tranh để thực hiện điều này trong hơn một tháng nay. – EmptyStack

+0

Để làm điều đó trong thời gian thực, bạn có thể thử viết một trình đổ bóng OpenGL trong glsl. Một thuật toán mã giả cơ bản sẽ là một cái gì đó như thế này: 'pixelColor = (old_h, old_s, old_v); pixelDiff = (chạm_h - old_h, chạm_s - old_s, chạm_v - old_v); resultColor = (new_h - pixelDiff.h, new_s - pixelDiff.s, new_v - pixelDiff.v); ' – user1118321

+0

Tính kết quảColor dựa trên màu cảm ứng không cho ra kết quả đồng đều vì màu của xe không phải là màu đồng nhất. Ví dụ, nếu tôi chạm vào một màu tối trong xe thì nó sẽ cho ra kết quả trong một biến thể, và nếu tôi chọn một màu sáng trong xe thì đầu ra sẽ có một biến thể khác. – EmptyStack

Các vấn đề liên quan